《设计模式》— 行为型模式 — 观察者模式
一、动机
将一个系统分割成一系列相互协作的类有一个常见的副作用:需要维护相关对象间的一致性。我们不希望为了维持一致性而使各类紧密耦合,因为这样降低了其可复用性。
例如,许多图形用户界面工具箱将用户应用的界面和负责界面表示与底下的应用数据分离。定义引用数据的类和负责界面表示的类可以各自独立地复用。当然它们也可以一起工作。一个表格对象和一个柱状图对象可使用不同的表示形式描述同一个应用数据对象的信息。表格对象和柱状图对象互相不知道对方的存在,这样使你可以根据需要单独复用表格或柱状图。而且从它们的行为来看它们似乎相互知道。当用户改变表格中的信息时,柱状图能立即反映这一变化,反过来也是如此。
这一行为意味着表格对象和柱状图对象都依赖与数据对象,因此数据对象的人和状态改变都应立即通知它们。同时也没有理由将依赖于该数据对象的对象数目限定为两个,对相同的数据可以有任意数目的不同用户界面。
观察者模式描述了如何建立这种关系。这一模式中的关键对象是目标和观察者。一个目标可以有任意数目的依赖它的观察者。一旦目标的状态发生改变,所有的观察者都得到通知。作为对这个通知的响应,每个观察者将查询目标以使其状态与目标的状态同步。
这种交互也称为发布订阅模式。目标是通知的发布者。它发出通知时并不需要知道谁是它的观察者,可以由任意数目的观察者订阅并接收通知。
二、适用性
- 一个抽象模型有两个方面,其中一个方面依赖于另一方面。将这二者封装在独立的对象中,以使它们可以各自独立地改变和复用。
- 对一个对象的改变需要同时改变其他对象,而不知道具体有多少对象有待改变。
- 一个对象必须通知其他对象,而它又不能假定其他对象是谁。
三、结构
四、参与者
1、Subject
- 目标知道它的观察者。可以由任意多个观察观察同一个目标。
- 提供注册和删除观察者对象的接口。
2、Observer
为那些在目标发生该表示需要获得通知的对象定义一个更新接口。
3、ConcreteSubject
- 将有关状态存入 ConcreteObserver