Archive for 14 10 月, 2010

设计模式学习——Observer(观察者)

星期四, 14 10 月, 2010

意图:在对象之间定义一种一对多的依赖关系,这样当一个对象的状态改变时,所有依赖者都将得到通知并自动更新。

问题:当某个事件发生时,需要向一系列变化着的对象发出通知。

解决方案:Observer将监视某个事件的责任委托给中心对象:Subject。

参与者与协作者:Subject知道自己的Observer,因为Observer要向它注册。Subject必须在所监视的事件发生时通知Observer。Observer负责向Subject注册,以及在得到通知时从Subject处获取信息。

效果:如果某些Observer只对事件的一个子集感兴趣,那么Subject可能会告诉它们不需要知道的事件。如果Subject通知Observer,Observer还返回请示更多信息,则可能需要额外的通信。

实现:让某个事件发生时需要知道的对象(Observer)将自己注册到另一个监视事件发生或自己触发事件的对象(Subject)上。事件发生时,Subject告诉Observer事件已经发生。为了对所有Observer类型的对象实现Observer接口,有时候需要使用Adapter模式。

(更多…)

设计模式学习——Decorator(装饰)

星期四, 14 10 月, 2010

意图:动态地给一个对象添加职责。

问题:要使用的对象执行所需的基本功能。但是,可能需要为这个对象将添加某些功能,这些附加功能可能发生在对象的基础功能之前或之后。

解决方案:可以无需创建子类,而扩展一个对象的功能。

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

效果:所添加的功能放在小对象中。好处是可以在ConcreteComponent对象的功能之前或之后动态添加功能。注意,虽然装饰对象可以在被装饰对象之前或之后添加功能,但对象链总是终于ConcreteComponent对象。

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

(更多…)