装饰模式(Decorator)

(内容主要来自Design Pattern GoF)

一.定义

动态地给一个对象添加一些额外的职责。装饰模式相比生成子类更灵活。

(注:1.动态--能灵活添加,并不是static的。  2.对象--装饰针对的是一个对象并不是类 。)

 

二.角色

2.1 Component (被装饰的角色)

2.2 Decorator (任务是装饰Component)

在真正实现中往往还有两个角色

2.3 VirtualComponent  (Component的抽象类)

2.4 ConcreteDecorator (Decorator的实现类,不过很多时候也会把Decorator直接写成非抽象类、非接口类)

 

三.角色间关系(类图)

 

image

 

四.通过上面的类图来分析如何实现对一个对象进行装饰的。

4.1 Decorator和被装饰的对象继承自同一个接口类, 这样客户类不需要知道“装饰”的存在,不需要做出修改就能工作。

4.2 Decorator持有被装饰对象Component的一个引用, 被装饰的对象也不需要知道“装饰”的存在,呈聚合关系。

4.3 Decorator在调用被装饰对象的接口之前或者之后执行“装饰”工作, 在Operation前后执行 AddedBehavivor.

 

五.总结

  装饰和被装饰者的组合是动态的临时的,而且是存在多种组合情况。同一装饰可以和多个被装饰对象组合。如果通过子类化实现的话,会产生相对比较多的类。

例如下图:

image

  BorderDecorator和ScrollDecorator并不是只能装饰 TextView,还可以装饰比如ImageView、ListView等只要是继承自VirtualComponent的类的象。如果不使用装饰模式的话,可能会产生如ScrollTextView、BorderTextView等类。

posted @ 2016-06-08 15:19  KbDaVinci  阅读(140)  评论(0编辑  收藏  举报