意图:定义对象间一种一对多的依赖关系,当一个对象的状态发生改变时所有依赖于它的对象都得到通知并被自动更新。
动机:Observer模式中关键对象是目标和观察者,一个目标可以有任意数目的依赖它的观察者,一旦目标的状态发生变化,所有的观察者都得到通知。作为对于这个通知的相应,每个观察者都将查询目标以使其状态与目标状态同步。这种交互也成为发布-订阅。目标是通知的发布者。它发出通知的时候并不知道谁是它的观察者,可以有任意数目的观察者订阅并接受通知。
适用性:一个抽象模型有两个方面,其中一个方面依赖于另外一个方面;对一个对象的改变需要同时改变其他对象,但不知道有多少对象有待改变;一个对象必须通知其他对象,而它又不能假定其他对象是谁。
结构如下:
参与者:
Subject: 目标知道它的观察者;提供注册和删除观察者对象的接口
Observer:观察者具有自我更新状态的接口
ConcreteSubject : 将有关状态存入各个ConcreteOberver对象;当状态发生改变时通知各个观察者。
ConcreteObserver:维护ConcreteSubject对象的引用;存储有关状态;实现Observer的接口,使其自身状态于目标状态保持一致。
代码实现如下:
1 |
|
在代码中以将观察者定义为函数,当有参数传入到mySubject中,mySubject的状态发生改变,然后mySubject通知它的所有观察者,更新这些观察者的状态。上面的代码是c++11的代码。下面的代码是设计模式中的代码:
1 | class Subject; |
这里简化了一些信息。