设计模式(八)【Observer模式】

Observer模式

《设计模式》分类

分类 意图 例子 用途
创建型 创建或实例化对象 Abstract Factory
Singleton
Double-Checked Locking
Factory Method
实例化对象
结构型 将已有的对象组合起来 Facade
Adapter
Bridge
处理接口
将实现与抽象联系起来
行为型 给出一种提供灵活(变化)行为的方式 Strategy 封装边变化

Observer模式是一个解耦型(行为型)模式。

《设计模式》中对Observer意图的叙述如下:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知并自动更新。

事例

需求:只要有一个新消费者进入系统就进行一下操作:
1、向其发送一封欢迎邮件
2、向邮政局查证消费者的地址
但是,这并不一定是全部需求。如果这是全部需求的话,我们可以使用如下设计:
设计模式(八)【Observer模式】

解决方案

观察者:希望获得通知的对象,包含两个方法:
1、attach(Observer)——将给定的Observer添加到目标观察者列表中
2、detach(Observer)——从目标额Observer列表中删除给定的观察者对象
Subject对象由已注册的Observer对象,事件发生时,Subject对象通知Observer对象。为此每个Observer对象都要实现一个update方法。
Subject类将实现一个notify方法来遍历其Observer对象列表,并调用每个Observer对象的update方法,该update方法应该包含处理事件的代码。
设计模式(八)【Observer模式】

Observer模式 关键特征
意图 对象见存在一对多依赖关系,这样当对象状态改变时,需要所有依赖者得到通知并能够自动更新
问题 事件发生时,需要向一系列变化的对象进行通知
解决方案 Observer将见识某个事件的责任委托给中心对象Subject
参与者与协作者 Subject必须知道自己的Observer,因为Observer要向它注册。Subject必须在所监视的事件发生时通知Observer。Observer负责向Subject注册,以及在得到通知时从Subject中获取信息
效果 如果某些Observer只对事件的一个子集感兴趣,那么Subject可能会告诉它们不需要知道的事件。如果Subject通知Observer,Observer还返回请求更多的信息,则可能需要额外的通信
实现 让某个事件发生时需要知道的对象(Observer)将自己注册到另一个监视事件发生或触发事件的对象(Subject)上。
事件发生时,Subject告诉Observer事件发生。
为了对所有Observer类型对象实现Observer接口,有时候需要使用Adapter模式。

设计模式(八)【Observer模式】

参考《设计模式解析》第二版