Observer(观察者模式) -- 对象行为型模式
别名
依赖,发布-订阅(publish - subscribe)
意图
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
主要解决的问题
一个对象状态改变给其他对象通知的问题,而且 要考虑到易用和低耦合,保证高度的协作。
如何解决
使用面向对象技术,可以将这种依赖关系弱化
这个模式的关键对象是目标(subject) 和 观察者(observer)。一个目标可以有任意数目的依赖于它的观察者,一旦目标的状态发生改变,所有的观察者都得到通知,作为对这个通知的响应,每个观察者都将查询目标以使其状态于目标的状态同步。
这种交互也叫做发布 - 订阅(publish - subscribe)。目标是通知的发布者,它发出的通知并不知道谁是它的观察者,可以有任意数目的观察者订阅并接收通知
适用性
在以下情况可以使用观察者模式:
- 一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将二者分装在独立的对象中,以使它们可以各自独立的改变和复用。
- 对一个对象的改变需要同时改变其他对象,而不知道具体有多少对象有待改变
- 一个对象必须通知其他对象,而它又不能假定其对象是谁,换言之,不希望这些对象是紧密耦合的。
参与者
- Subject(目标)
目标知道他的观察者,可以有任意多个观察者观察同一个目标
提供注册和删除观察者对象的接口
- Observer(观察者)
为那些在目标发生改变时需要获得通知的对象的定义的一个更新接口
- ConcreteSubject(具体目标)
将有关状态存入各ConcreteSuject对象
当它的状态发生改变时,向其各个观察者发出通知
- ConcreteObserver(具体观察者)
维护一个指向ConcreteSubject对象的引用
存储有关状态,这些状态应与目标的状态保持一致
实现Observer的更新接口,以使自身状态与目标的状态保持一致
经典结构图
代码实现
目标及具体目标:
观察者及具体观察者:
这里Subject
维护了一个list作为存储所有观察者的容器(以空间换时间),每当调用notify
操作就会便利list中的Observer对象,并广播通知(调用Observer的Update操作),