观察者(observer)模式又称依赖(dependents)模式或发布-订阅(publish-subscribe)模式。
属于对象行为型模式。
观察者模式定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于他的对象都得到通知并被自动更新。
观察者模式定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于他的对象都得到通知并被自动更新。
观察者模式是一种对象之间松耦合的设计方法;松耦合的好处在于,当两个对象之间松耦合时,它们任然可以交互,但是不太清楚彼此的细节。
观察者模式的基本结构图:

从观察者模式的结构图中可以看出,观察者模式中有抽象的观察者(observer)、抽象的主题(subject)、具体的主题、具体的观察者。这一模式中的关键对象是主题和观察者,一个主题可以有任意数目的依赖它的观察者。一旦目标的状态发生改变,所有的观察者都得到通知。该通知可以将状态直接传递给观察者,也可以由观察者获取该通知后从主题中获取状态,前者称为推方式,后者称为拉方式。主题知道他有哪些观察者,并提供注册和删除观察者对象的接口;观察者为那些在主题发生改变时需获得通知的对象定义一个更新接口;;具体的主题保存具体主题对象的各种状态,并在状态改变时向各个观察者发出通知;具体的观察者用于实现观察者的更新接口,保持自身状态与目标状态保持一致,并维护一个指向ConcreteObserver对象。
观察者模式的协作图:

协作图中的第一步按照实际情况调整,可以在其它类中进行调用,当具体的主题对象状态发生改变时调用notify方法对各个观察者对象通知,通过分别调用每个保存在观察者集合中的观察者对象的updata方法进行通知,然后各个观察者通过主题的GetState获取状态,保持同步。
通过上面的介绍,对观察者模式有了清楚的认识。下面说说观察者模式可以用在哪些场合:1)当一个抽象模型有两个方面,其中一个方面依赖于另一方面。将这两者封装在独立的对象中,使他们可以各自独立的改变和复用;2)当对一个对象的改变需要同时改变其他对象,但不知道具体有多少对象需要改变;3)当一个对象必须通知其他对象,而它又不能假定其它对象是谁。
下面我们用C++来实现观察者模式;
首先,编写主题的基类subject,提供注册方法、取消方法、通知方法、提供保存观察者的变量;然后编写具体主题类,该类用于维护该类的状态,提供设置状态和获取状态的方法,提供保存状态的变量;主题编写完成后我们开始编写观察者,首先定义观察者接口类,在C++中可以通过将其定义为抽象类(纯虚函数)实现接口的功能;该接口中提供更新方法和显示方法;然后定义两个具体的观察者,分别实现抽象类中的接口;最后编写测试程序。
观察者模式的演变,对于一些主题和观察者之间依赖关系较为复杂的情况,我们引入了更改管理器。其类图如下
