运行时扩展,远比编译时期的继承威力大
用对象组合的方式,做到运行时装饰类
1.
——类爆炸,每个cost方法计算出咖啡单上各种调料的价钱
——从基类下手,加上实例变量代表是否加上调料
调料价格改变会修改现有代码
出现新的调料,需要加上新的方法,并改变超类的cost方法
要双倍的摩卡咖啡,怎么办?
有些饮料不要调料
2.
设计原则:类应该对扩展开放,对修改关闭
——拿一个DrakRoast对象,以摩卡对象装饰它,以奶泡对象装饰它,调用cost方法,并依赖委托将调料的价格加上去
装饰者模式:动态地将责任附加到对象上。若要扩展功能,装饰者提供比继承更有弹性的替代方案。
装饰者和被装饰着对象有相同的超类型;可以用一个或者多个装饰者包装一个对象;
任何需要原始对象的场合都可以用装饰过的对象代替它;
装饰者可以在所委托被装饰者的行为之前或之后,加上自己的行为,以达到特定的目的。
Component 每个组件可以单独使用,或者被装饰着包起来使用;
Decorator,每个装饰者都“有一个”组件;用这个实例变量保存某个Component的引用
ConcreteDecoratorA,装饰者可以加上新方法,新行为通过在旧行为前或后做一些计算来添加
ConcreComponent,动态地加上新行为的对象
原以为:这个模式中不会使用继承,而是利用组合取代继承
装饰者和被装饰者必须是一样的类型,共同的超类,利用继承达到“类型匹配”,而不是为了继承获得“行为”,新行为是由组合对象得到的。
如果依赖继承,类的行为只能在编译时静态决定;利用组合,在“运行时”混合着用
3.
InputStream in = new LineNumberInputStream(new BufferedInputStream(new FileInputStream("test.txt")));