意图
动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更加灵活。
对装饰和内容一视同仁。
Decorator是“进行Decorate(装饰)的主体”的意思。
适用性
当需要给一个类添加新的行为的时候,但基于开闭原则,就使用装饰模式。
在以下情况使用Decorator模式:
1. 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责
2. 处理那些可以撤销的职责
3. 当不能采用生成之类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或者类定义不能生成之类。
结构
参与者
Component
定义一个对象接口,可以给这些对象动态增加职责。
ConcreteComponent
定义一个对象,可以给这个对象增加一些职责
Decorator
维持一个指向Component对象的指针,并定义一个与Component接口一致的接口(可以直接实现Component接口)。
ConcreteDecorator
向组件添加职责
Client
使用组合完成功能的扩展。
代码
Component
public interface Component {
public void defaultMethod();
}
ConcreteComponent
public class ConcreteComponent implements Component{
public void defaultMethod(){
System.out.println("====ConcreteComponent===defaultMethod===");
}
}