装饰模式(Decorator)
(内容主要来自Design Pattern GoF)
一.定义
动态地给一个对象添加一些额外的职责。装饰模式相比生成子类更灵活。
(注:1.动态--能灵活添加,并不是static的。 2.对象--装饰针对的是一个对象并不是类 。)
二.角色
2.1 Component (被装饰的角色)
2.2 Decorator (任务是装饰Component)
在真正实现中往往还有两个角色
2.3 VirtualComponent (Component的抽象类)
2.4 ConcreteDecorator (Decorator的实现类,不过很多时候也会把Decorator直接写成非抽象类、非接口类)
三.角色间关系(类图)
四.通过上面的类图来分析如何实现对一个对象进行装饰的。
4.1 Decorator和被装饰的对象继承自同一个接口类, 这样客户类不需要知道“装饰”的存在,不需要做出修改就能工作。
4.2 Decorator持有被装饰对象Component的一个引用, 被装饰的对象也不需要知道“装饰”的存在,呈聚合关系。
4.3 Decorator在调用被装饰对象的接口之前或者之后执行“装饰”工作, 在Operation前后执行 AddedBehavivor.
五.总结
装饰和被装饰者的组合是动态的临时的,而且是存在多种组合情况。同一装饰可以和多个被装饰对象组合。如果通过子类化实现的话,会产生相对比较多的类。
例如下图:
BorderDecorator和ScrollDecorator并不是只能装饰 TextView,还可以装饰比如ImageView、ListView等只要是继承自VirtualComponent的类的象。如果不使用装饰模式的话,可能会产生如ScrollTextView、BorderTextView等类。