2018 March 03 设计模式, 观察者模式
设计模式-观察者模式
1.参与者
- Subject(目标): => 抽象主题角色
- 目标知道它的观察者,可以有任意多个观察者观察同一个目标
- 提供注册和删除观察者对象的接口
- Observer(观察者): => 抽象观察者角色
- 为那些在Subject(目标)发生改变时需要获得通知的对象定义一个更新窗口
- Observer不一定需要Subject的引用
- 定义一个更新接口,在接到Subject(目标)的通知时更新自己
- ConcreteSubject(具体目标)
- 将有关状态存入各ConCreteObserver对象
- 当它的状态发生改变时,向它的各个观察者发出通知
- ConcreteObserver(具体观察者)
- 维护一个指向ConcreteSubject对象的引用(在构造函数中设置)
- 存储有关状态,这些状态应当与目标的状态保持一直
- 实现Observer的更新窗口,以使其自身状态与目标的状态保持一致
2.特点
- 定义了对象之间一对多的关系
- 一个目标对象跟踪它应通知的观察者的最简单的方式是保存对它们的引用。但是当目标很多但是观察者较少时,这样存储可能代价较高。
- 在某些情况下,一个观察者依赖于多个目标可能是有意义的。此时目标对象可以简单地将自己作为观察者Update操作的一个参数,让观察者知道应该去检查哪一个目标。
3.推模型和拉模型
- 推模型:
- 目标对象向观察者发送目标的详细信息,不管观察者是否需要,推送的信息通常是目标对象的全部或部分数据
- 拉模型
- 目标对象在通知观察者时,只传递少量信息。如果观察者需要更具体的信息,由观察者主动到目标对象中获取,相当于是观察者从目标对象中拉数据。
- 一般这种模型的实现中,会把目标对象自身通过update()方法传递给观察者,这样观察者在需要获取数据的时候,就可以通过这个引用来获取了。