CH14-行为型-观察者

模式动机

建立一种对象与对象之间的依赖关系,一个对象改变时将自动通知其他对象,其他对象将作出相应反应。在此,发生改变的对象成为观察目标,被通知的对象成为观察者,一个观察目标可以对应多个观察者,而且这些观察者之间没有相互联系,可以根据需要增加或删除观察者,使得系统更易于扩展。这便是该模式的动机。

模式定义

观察者模式(Observer Pattern):定义对象的一种一对多关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。或称为发布-订阅(Publish/Subscribe)模式、模型-试图(Model/View)模式、源-监听(Source/Listener)模式、从属(Dependents)模式

模式结构

包含 4 中角色:

  • Subject:目标
  • ConcreteSubject:具体目标
  • Observer:观察者
  • ConcreteObserver:具体观察者

类图

NAME

时序图

NAME

模式分析

  • 管擦者模式描述了如何建立对象与对象之间的依赖关系,如何构造满足这种需求的系统。
  • 该模式中的关键对象是观察目标和管擦者,一个目标可以有任意数目的、与之相依赖的观察者,一旦目标的状态发生改变,所有的观察者都将得到通知。
  • 作为多这个通知的响应,每个观察者都将更新自己的状态,以与目标状态同步,这种交互也被称为发布-订阅。目标是通知的发布者,它发出通知时并不知道谁是它的观察者,可以有任意数量的观察者订阅它并接收通知。

优点

  • 该模式可以实现表示层和数据逻辑层的分离,并定义了稳定的消息更新传递机制,抽象了更新接口,使得可以有各种不同的表示层作为具体观察者角色。
  • 该模式在观察目标和观察者之间建立了一个抽象的耦合。
  • 观察者模式支持广播通信。
  • 观察者模式符合“开闭原则”。

缺点

  • 如果一个目标对象有很多直接和间接的观察者的话,将所有的观察者都通知到将会花费很多时间。
  • 如果在观察者和目标之间有循环依赖的话,目标会触发他们之间进行循环调用,导致系统崩溃。
  • 该模式没有相应的机制让观察者知道相应的观察目标是怎样发生变化的,而仅仅只是知道目标发生了变化。

适用场景

  • 一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这些方面封装在独立的对象中,可以使他们各自独立的改变和复用。
  • 一个对象的改变将导致其他一个或多个对象也发生改变,而不知道具体有多少个对象发生改变,可以降低对象之间的耦合度。
  • 一个对象必须通知其他对象,而并不知道这些对象是谁。
  • 需要在系统中创建一个触发链,A 对象的行为将影响 B 对象, B 对象的行为将会影响 C 对象…等等,可以使用该模式创建一种链式触发机制。