装饰者模式动态地将责任附加到对象上,若要扩展功能,装饰者提供比继承更有弹性的替代方案,
- 组件和装饰者继承自相同的抽象类/接口
- 装饰者有个变量记录组件
- 通过嵌套调用实现装饰
for example:
星巴克咖啡:
- 基础咖啡作为组件
- 调料作为装饰者
- 调料可以任意搭配,比如:奶泡、摩卡、糖浆等等
//超类组件
public abstract class component {
methodA();
methodB();
}
//继承自超类组件,为了让装饰者和组件有相同的类型,好使用多态
public abstract class decorator extends component {
methodA();
}
//组件子类
public class ConcreteComponents extends component {
methodA();
methodB();
}
//装饰类子类
public class ConcreteDecorator extends decorator {
component c;
method....
}
public class ConcreteDecorator2 extends decorator {
component c;
method....
}
...public class ConcreteDecoratorN extends decorator {
component c;
method....
}..
//使用实例
void main(){
component c = new ConcreteComponent; //新建一杯基础咖啡
c = new ConcreteDecorator(c); //加上摩卡
c = new ConcreteDecorator(c); //加上摩卡,变成双份摩卡ß
c = new ConcreteDecorator2(c); //加上奶泡
.....
}
总结:装饰者通过继承类型、多态及组合使用达到装饰效果