-
意图:
动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。 -
别名:
包装器Wrapper -
动机:
希望给某个对象而彼时整个类添加一些功能。 -
适用性:
a. 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
b. 处理那些可以撤销的职责。
c. 当不能采用生成子类的方法进行扩充时。 -
结构:
-
参与者:
a. Component: 定义一个对象接口,可以给这些对象动态的添加职责。
b. ConcreteComponent: 定义一个对象,可以给这个对象添加一些职责。
c. Decorator:维持一个指向Component对象的指针,并定义一个与Component接口一致的接口。
d. ConcreteDecorator: 向组件添加职责。 -
协作:
a. Decorator将请求转发给它的Component对象,并有可能在转发请求前后执行一些附加的动作。 -
效果:
a. 比静态继承更灵活
b. 避免在层次结构高层的类有太多的特征
c. Decorator与它的Component不一样
d. 有许多小对象 -
实现:
a. 接口的一致性
b. 省略抽象的Decorator类
c. 保持Component类的简单性
d. 改变对象外壳与改变对象内核 -
代码示例:
public interface Component { void operation(); } public class ConcreteComponent implements Component{ @Override public void operation() { System.out.println("This is ConcreteComponent"); } } public class Decorator implements Component { protected Component component; public Decorator(Component component) { this.component = component; } @Override public void operation() { component.operation(); } } public class ConcreteDecoratorA extends Decorator { private String addedState; public ConcreteDecoratorA(Component component) { super(component); } public String getAddedState() { return addedState; } public void setAddedState(String addedState) { this.addedState = addedState; } } public class ConcreteDecoratorB extends Decorator{ public ConcreteDecoratorB(Component component) { super(component); } public void addedBehavior() { System.out.println("This is ConcreteDecoratorA addedBehavior"); } }
-
已知应用:
-
相关模式:
Adapter模式:Decorator模式不同于Adapter模式,因为装饰仅改变对象的职责而不改变它的接口;而适配器将给对象一个全新的接口。
Composite模式:可以将装饰视为一个退化的、仅有一个组件的组合。装饰仅给对象添加一些额外的职责–它的目的不在于对象聚合。
Strategy模式:用一个装饰你可以改变对象的外表,而Strategy模式使得你可以改变对象的内核。这是改变对象的两种途径。