2008年8月2日星期六

Decorator模式

Decorator模式
动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。
ConcreteDecoratorB对象执行自己的Operation方法,然后调用Decorator类的Operation方法。这会调用ConcreteDecoratorB对徐爱那个之后的Component对象的Operation方法。
每个Decorator对象都对气候的对象封装自己的新功能。每个Decorator对象在被装饰的功能之前或之后执行自己的附加功能。
Decorator模式帮助我们将问题分解为两个部分:
  • 如何实现提供新功能的对象。
  • 如何为每种特定情况将对象组织起来。
将“Decorator对象的实现”与“判断如何使用它们的对象”相分离。这提高了内聚度,因为每个Decorator对象只关心自己添加的功能——而不关心自己如何被添加到对象链中。
Decorator模式的威力要求对象链的实例化与使用它的对象完全分离。最典型的实现方式是:使用工厂对象,在某些配置信息的基础上实例化对象链。
Decorator模式是为现有的功能动态添加附加功能的一种方法。实际情况要求创建一条对象链来提供需要的行为。对象链的第一个对象被客户对象调用,客户对象不关心对象链的创建。通过保持对象链的创建与使用的互相独立,添加功能的新需求不会对客户对象造成影响


Decorator模式:关键特征
意图 为一个对象动态连接附加的职责。

问题 你需要使用的对象执行你要求的基本功能。但是,你可能需要为这个对象添加某些功能,
这些附加功能可能发生在对象的基础功能之前或之后。(Java基础类在I/O处理中广泛使用了
Decorator模式)

解决方案 允许扩展一个对象的更能,而不必借助于子类型化。

参与者与协作者 Decorator对象为ConcreteComponent添加功能。有时候ConcreteComponent的派生类被用于提供核心功能,在这种情况下ConcreteComponent类就不再是具体的,而是抽象的。Component类定义了所有这些类使用的接口。

效果 被添加的功能属于小的对象。好处是可以在ConcreteComponent对象的功能之前或之后动
态添加功能。注意:虽然一个装饰着可以在被装饰者之前或之后添加功能,但对象链总是以ConcreteComponent对象结束。

实现 创建一个抽象类来表示原始的类和要添加到这个类上的新功能。在装饰者类中,将“对新功能的调用”放在“对紧随其后对象的调用”之前或之后,以获得正确的顺序。

没有评论: