意图:
装饰模式可在不改变原有对象的行为下,扩展其行为;
提供了比继承更有弹性的替代方案;
动态地给一个对象添加一些额外的职责;
别名:包装器(Wrapper)模式
来自Head First
- 装饰者和被装饰对象有相同的类型,这样客户端对象就可以用和真实对象相同的方式和装饰对象交互;
- 可用一个或多个装饰者包装一个对象;
- 在任何需要原始对象(被包装)的场合,可用装饰过的对象代替它(扩展原始对象的行为);
- 装饰者可在所委托被装饰者的行为之前或之后,加上装饰后的行为,以达到目的;
- 对象可在任何时候,被装饰,所以可以在运行时动态地、不限量的装饰者来装饰对象;
6.装饰对象包含一个真实对象的引用;
示例类图:

也可以将 被包装的类,放入 Decorator基类中,并设置成 protected类型的变量,这样做,其实更好,子类,就不需要维护 wrapped 对象了;

装饰者模式中的角色
- 被装饰者抽象(Component):是一个抽象接口,或抽象类,也是该模式中的最元素的对象了;
- 被装饰者具体实现(ConcreteComponent),也是上图中的ComponentA;
要装饰的就是这个具体的实现类,可以有多个,具体实现类,如: java io 体系; - 装饰者基类(Decorator)可以是一个抽象类,或者类,用来实现被装饰者抽象(Component)中的方法,实现是通过 Componet 对象的引用来实现的;
- 装饰者实现,如上图中的(DecoratorA 与 DecoratorB)是具体的装饰者类,用来装饰最基本的类,如:ComponentA;
网友评论