设计模式二:装饰者模式

设计模式二:装饰者模式

本文摘自:《Head First 设计模式》

动态地将责任附加到对象上。若要扩展功能,装饰者提供比继承更有弹性的替代方案。

这样说起来比较抽象,如书中示例:coffee口味何其多(不同咖啡豆+不同调料),根据咖啡豆和调料计算出不同价格,如果每一种口味都有一个类,将导致类爆炸。我们可以让各种调料作为一个装饰者,动态添加到每一种咖啡中。

类图

示例:coffee

饮料抽象类:

public abstract class Beverage {
    String description = "Unkown Beverage";
    public String getDescription(){
        return description;
    }
    public abstract double cost();
}

具体组件,被扩展的对象:

public class HouseBlend extends Beverage {
    public HouseBlend(){
        description = "Espresso";
    }
    public double cost(){
        return 0.89;
    }
}

装饰者的抽象类/接口

public abstract class CondimentDecorator extends Beverage{
    public abstract String getDescription();
}

具体装饰类:摩卡

public class Mocha extends CondimentDecorator {
    Beverage beverage;
    public Mocha(Beverage beverage){
        this.beverage = beverage;
    }

    @Override
    public String getDescription() {
        return beverage.getDescription() + ", Mocha";
    }
    public double cost(){
        return 0.20 + beverage.cost();
    }
}

开始来一杯coffee,多少钱?

public static void main(String[] args) {
    Beverage beverage = new HouseBlend();
    beverage = new Mocha(beverage);
    System.out.println(beverage.getDescription() + " $" +
    beverage.cost());
}

House Blend Coffee, Mocha $1.09

java中的装饰者模式

java中I/O类:
InputStream :对应抽象Component
FileInputStream:具体组件
FilterInputStream: 具体装饰者继承这个类
BufferedInputStream:具体装饰者

设计原则

  1. 对扩展开放,对修改关闭
CONTENTS