一、意图
动态的给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。
二、适用性
以下情况使用Decorator模式
- 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
- 处理那些可以撤销的职责。
- 当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定位被隐藏,或类定义不能用于生成子类。
三、结构
四、代码
public abstract class Component {
public abstract void operate();
}
public class ConcreteComponent extends Component {
@Override
public void operate() {
System.out.println("ConcreteComponent.");
}
}
public class Decorator extends Component {
private Component component;
public Decorator( Component component){
this.component = component;
}
@Override
public void operate() {
this.component.operate();
}
}
public class ConcreteDecoratorA extends Decorator {
public ConcreteDecoratorA(Component component) {
super(component);
}
public void operate(){
operateA();
super.operate();
operateB();
}
private void operateB() {
System.out.println("ConcreteDecoratorB.operateB");
}
private void operateA() {
System.out.println("ConcreteDecoratorA.operateA");
}
}
public class ConcreteDecoratorB extends Decorator {
public ConcreteDecoratorB(Component component) {
super(component);
}
public void operate(){
operateA();
super.operate();
operateB();
}
private void operateB() {
System.out.println("ConcreteDecoratorB.operateB");
}
private void operateA() {
System.out.println("ConcreteDecoratorB.operateA");
}
}
public class Client {
public static void main(String[] args){
//构造被装饰的组件对象
Component component = new ConcreteComponent();
//根据组件对象构造装饰者对象A并调用,此时相当于给组件对象增加装饰者A的功能方法
Decorator decorator = new ConcreteDecoratorA(component);
decorator.operate();
System.out.println("----------------------------------------------------");
// 根据组件对象构造装饰者对象B并调用,此时相当于组件对象增加装饰者B的功能方法
Decorator decoratorB = new ConcreteDecoratorB(component);
decoratorB.operate();
}
}