Observer模式
《设计模式》分类
分类 | 意图 | 例子 | 用途 |
---|---|---|---|
创建型 | 创建或实例化对象 | Abstract Factory Singleton Double-Checked Locking Factory Method | 实例化对象 |
结构型 | 将已有的对象组合起来 | Facade Adapter Bridge | 处理接口 将实现与抽象联系起来 |
行为型 | 给出一种提供灵活(变化)行为的方式 | Strategy | 封装边变化 |
Observer模式是一个解耦型(行为型)模式。
《设计模式》中对Observer意图的叙述如下:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知并自动更新。
事例
需求:只要有一个新消费者进入系统就进行一下操作:
1、向其发送一封欢迎邮件
2、向邮政局查证消费者的地址
但是,这并不一定是全部需求。如果这是全部需求的话,我们可以使用如下设计:
解决方案
观察者:希望获得通知的对象,包含两个方法:
1、attach(Observer)——将给定的Observer添加到目标观察者列表中
2、detach(Observer)——从目标额Observer列表中删除给定的观察者对象
Subject对象由已注册的Observer对象,事件发生时,Subject对象通知Observer对象。为此每个Observer对象都要实现一个update方法。
Subject类将实现一个notify方法来遍历其Observer对象列表,并调用每个Observer对象的update方法,该update方法应该包含处理事件的代码。
Observer模式 | 关键特征 |
---|---|
意图 | 对象见存在一对多依赖关系,这样当对象状态改变时,需要所有依赖者得到通知并能够自动更新 |
问题 | 事件发生时,需要向一系列变化的对象进行通知 |
解决方案 | Observer将见识某个事件的责任委托给中心对象Subject |
参与者与协作者 | Subject必须知道自己的Observer,因为Observer要向它注册。Subject必须在所监视的事件发生时通知Observer。Observer负责向Subject注册,以及在得到通知时从Subject中获取信息 |
效果 | 如果某些Observer只对事件的一个子集感兴趣,那么Subject可能会告诉它们不需要知道的事件。如果Subject通知Observer,Observer还返回请求更多的信息,则可能需要额外的通信 |
实现 | 让某个事件发生时需要知道的对象(Observer)将自己注册到另一个监视事件发生或触发事件的对象(Subject)上。 事件发生时,Subject告诉Observer事件发生。 为了对所有Observer类型对象实现Observer接口,有时候需要使用Adapter模式。 |
参考《设计模式解析》第二版