装饰者模式

简介: 装饰者模式

装饰者模式:

意图:动态的给一个对象添加一些额外的职责,就增加功能来说,装饰者模式相比生成子类更为灵活,该模式以对客户端透明的方式扩展对象的功能

适用环境:在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。

通俗来讲,比如我们开个饮品店,主要卖牛奶,但是由于不同的需要,有的需要牛奶+糖,有的需要牛奶+珍珠,有的需要牛奶+冰等等等等,当然不同的方式,所需要的价格不一样,我们怎么办,每一种方式都写一个实现类嘛,这样实现类只会越来越多,这是我们就需要一个装饰类来处理这种事情,饮品店和牛奶就是我们被装饰的接口和被装饰的类,是比较抽象哈,上代码。

被装饰的接口

public interface Milk {
    /**
     * 计算价格
     */
    float price();
    /**
     * 牛奶成分的描述
     */
    String describe();
}

被装饰的类:

public class DrinkMilk implements Milk {
    @Override
    public float price() {
        return 10f;
    }
    @Override
    public String describe() {
        return "牛奶";
    }
}

具体的装饰类:

public abstract class Decorator implements Milk {
    private final Milk milk;
    public Decorator(Milk milk) {
        this.milk = milk;
    }
    @Override
    public float price() {
        return milk.price();
    }
    @Override
    public String describe() {
        return milk.describe();
    }
}

比如加鸡蛋(我们只需要继承这个装饰类就可以了)

public class Egg extends Decorator {
    public Egg(Milk milk) {
        super(milk);
    }
    @Override
    public float price() {
        return super.price() + 2;
    }
    @Override
    public String describe() {
        return super.describe() + "加鸡蛋";
    }
}

同样,比如加珍珠

public class Pearl extends Decorator {
    public Pearl(Milk milk) {
        super(milk);
    }
    @Override
    public float price() {
        return super.price() + 2;
    }
    @Override
    public String describe() {
        return super.describe() + "加珍珠";
    }
}

测试代码

public class Test1 {
    public static void main(String[] args) {
        // 一杯牛奶
        Milk milk = new DrinkMilk();
        // 加鸡蛋
        Egg egg = new Egg(milk);
        // 加珍珠
        Pearl pearl = new Pearl(egg);
        System.out.println(pearl.price());// 14.0
        System.out.println(pearl.describe());//牛奶加鸡蛋加珍珠
    }
}


目录
相关文章
|
4月前
结构型 装饰器模式
结构型 装饰器模式
16 0
|
4月前
|
设计模式 Java
Java设计模式【十】:装饰者模式
Java设计模式【十】:装饰者模式
22 0
|
11天前
|
设计模式
装饰器模式
装饰器模式
9 0
|
1月前
|
设计模式 C++
【C++】—— 装饰器模式
【C++】—— 装饰器模式
|
8月前
|
设计模式
2023-6-26-第八式装饰器模式
2023-6-26-第八式装饰器模式
60 0
|
10月前
|
前端开发 BI
关于装饰器模式我所知道的
关于装饰器模式我所知道的
50 0
|
10月前
|
设计模式
我认为的装饰器模式
我认为的装饰器模式
72 0
|
11月前
|
Java
结构型模式-装饰者模式
结构型模式-装饰者模式
68 0
装饰者模式详解
装饰者模式详解
|
设计模式 Java uml
Java设计模式-装饰者模式
Java设计模式-装饰者模式
Java设计模式-装饰者模式