装饰模式-Decorator
名称:
装饰模式(Decorator Pattern)-对象结构型模式
问题:
The decorator pattern can be used to extend (decorate) the functionality of a certain object statically, or in some cases at run-time, independently of other instances of the same class, provided some groundwork is done at design time. This is achieved by designing a new decorator class that wraps the original class.
This pattern is designed so that multiple decorators can be stacked on top of each other, each time adding a new functionality to the overridden method(s).
动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator相比生成子类更加灵活。
适用性:
-在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
-处理那些可以撤销的职责。
-当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。
协作:
Decorator将请求转发给它的Component对象,并有可能在转发请求前后执行一些附加的动作。
优点和缺点:
1、比静态继承更灵活。
2、避免在层次结构高层的类有太多的特征。
3、Decorator与它的Component不一样。
4、有许多小对象。
解决方案:
1、 模式的参与者
1、Component
-定义一个对象接口,可以给这些对象动态地添加职责。
2、ConcreteComponent
-定义一个对象,可以给这个对象添加一些职责。
3、Decorator
-维持一个指向Component对象的指针,并定义一个于Component接口一致的接口。
4、ConcreteDecorator
-向组件添加职责。
2.实现方式
interface Component { public void operation(); }
class ConcreteComponent implements Component { public void operation() { } }
class Decorator implements Component { private Component component; public Decorator(Component component) { this.component=component; } public void operation() { component.operation(); } }
class ConcreteDecorator extends Decorator { public ConcreteDecorator(Component component) { super(component); } public void operation() { super.operation(); decoratorFunction(); } public void decoratorFunction() { } }
public class DecoratorPattern { public static void main(String[] args) { Component p=new ConcreteComponent(); p.operation(); Component d=new ConcreteDecorator(p); d.operation(); } }
装饰模式在java中的最著名的应用: Java I/O 标准库。
参考资料
《设计模式:可复用面向对象软件的基础》