装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。
装饰模式应该在以下情况下使用:
- 需要扩展一个类的功能,或给一个类增加附加责任。
- 需要动态地给一个对象增加功能,这些功能可以再动态地撤销。
- 需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变的不现实。
如图:
应用代码如下:
Component c = new ConcreteComponent();
Component d = new ConcreteDecorator(c);
d.operation();
使用装饰模式与继承关系的目的都是要扩展对象的功能,但是装饰模式可以提供比继承更多的灵活性,允许系统动态地决定贴上一个需要的"装饰",或者除掉一个不需要的"装饰".