设计模式二:装饰者模式
本文摘自:《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:具体装饰者
mybatis的缓存模块
设计原则
- 对扩展开放,对修改关闭