设计模式笔记 -- 装饰者模式

简介: 现在有几种饮品,都是单品咖啡,顾客可以点单品咖啡也可以点单品咖啡加调料。

案例说明


现在有几种饮品,都是单品咖啡,顾客可以点单品咖啡也可以点单品咖啡加调料。


首先有一个抽象类Drink


@Data
public abstract class Drink {
    //描述
    private String desc;
    //价格
    private float price = 0.0f;
    //计算价格的方法
    public abstract float cost();
}

然后有一个咖啡类继承Drink

public class Coffee extends Drink{
    @Override
    public float cost() {
        //不加调料的单品咖啡就是他的原价
        return getPrice();
    }
}

一种意大利咖啡继承咖啡类

public class Expresso extends Coffee{
    public Expresso(){
        setDesc("意大利咖啡");
        setPrice(6f);
    }
}

一种美式咖啡继承咖啡类


public class LongBlack extends Coffee {
    public LongBlack(){
        setDesc("美式咖啡");
        setPrice(10f);
    }
}

然后有一个装饰者类继承Drink,其中聚合了一个被装饰者对象


public class Decorator extends Drink {
    //聚合一个单品咖啡 //被装饰者
    private Drink drink;
    public Decorator(Drink drink){
        this.drink = drink;
    }
    @Override
    public float cost() {
        //调料自己的价格加上单品咖啡的价格
        return super.getPrice() + drink.cost();
    }
    @Override
    public String getDesc() {
        return super.getDesc() + super.getPrice() + drink.getDesc();
    }
}


有一个巧克力类继承装饰者类


public class Chocolate extends Decorator {
    public Chocolate(Drink drink) {
        super(drink);
        setDesc("巧克力");
        setPrice(2f);
    }
}

有一个牛奶类继承装饰者类

public class Milk extends Decorator {
    public Milk(Drink drink) {
        super(drink);
        setDesc("牛奶");
        setPrice(1f);
    }
}

这时可以创建一个咖啡厅类来点咖啡了


public class CoffeeBar {
    public static void main(String[] args) {
        //1 点一份单品美式咖啡
        Drink order = new LongBlack();
        System.out.println("费用:"+order.cost());
        //2 加入一份牛奶
        order = new Milk(order);
        System.out.println("费用:"+order.cost());
        //3 加入一份巧克力
        order = new Chocolate(order);
        System.out.println("费用:"+order.cost());
    }
}

输出结果



如果再添加一种新的咖啡或者一种新的调料,只需要去继承咖啡类或者装饰者类即可


装饰者模式在jdk中io流中有使用到


java的io结构中有一个InputStream类,这个类就好比上面案例中的Drink类


他的子类中有FileInputStream、StringBufferInputStream、ByteArrayInputStream,这几个就相当于上面案例中的单品咖啡,也就是被装饰者。


InputStream的子类还有一个FilterInputStream就是装饰者,FilterInputStream下面有几个子类,


BufferInputStream、DataInputStream、LineNumberInputStream就是上面案例中的调料


相关文章
|
4月前
|
设计模式 Java
Java设计模式【十】:装饰者模式
Java设计模式【十】:装饰者模式
22 0
|
7天前
|
设计模式 Java
【设计模式系列笔记】抽象工厂模式
抽象工厂模式(Abstract Factory Pattern)是一种设计模式,属于创建型模式之一。它提供了一种方式来创建一系列相关或相互依赖的对象,而无需指定它们具体的类。抽象工厂模式通过引入抽象的工厂接口,使得客户端代码可以使用抽象的接口来创建一组相关的产品,而不关心这些产品的具体实现。
103 4
|
4天前
|
设计模式 调度
【设计模式系列笔记】中介者模式
中介者模式(Mediator Pattern)是一种行为设计模式,它通过将对象之间的直接通信转移到一个中介对象中,来减少对象之间的耦合度。这种模式被用来处理一个对象与其他对象之间的交互,使得各对象之间不需要直接相互了解。
13 0
|
6天前
|
设计模式 Java 容器
【设计模式系列笔记】组合模式
组合模式(Composite Pattern)是一种结构型设计模式,它允许将对象组合成树状结构以表示部分-整体的层次结构。组合模式使得客户端可以统一处理单个对象和对象组合,而无需区分它们的类型。
38 12
|
6天前
|
设计模式
【设计模式系列笔记】桥接模式
桥接模式(Bridge Pattern)是一种结构性设计模式,它将抽象部分与实现部分分离,使它们可以独立变化而互不影响。桥接模式通过组合而不是继承的方式来实现这种分离。
27 6
|
2月前
|
设计模式 缓存 安全
设计模式-代理模式(静态代理、动态代理、cglib代理)、代理模式和装饰者模式的区别
设计模式-代理模式(静态代理、动态代理、cglib代理)、代理模式和装饰者模式的区别
55 1
|
3月前
|
设计模式 Go 开发工具
Golang设计模式——22装饰者模式
Golang设计模式——22装饰者模式
22 0
|
3月前
|
设计模式 存储 算法
设计模式笔记
设计模式笔记
|
9月前
|
设计模式
23种设计模式_MODE08装饰者模式_手写代码实现
23种设计模式_MODE08装饰者模式_手写代码实现
|
4月前
|
设计模式 Java
根据真实业务场景去实现一下设计模式中的装饰者模式
根据真实业务场景去实现一下设计模式中的装饰者模式
18 0