设计模式笔记(2)-观察者模式

建立一个一对多的依赖,当一个对象改变状态,依赖它的对象都将收到通知并自动更新。

观察者模式

观察者模式定义了对象之间的一对多依赖,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。

观察者模式提供了一种对象设计,让主题和观察者之间松耦合

  • 主题只知道观察者实现了Observer接口,不需要知道观察者的具体类是谁。
  • 任何时候我们都可以增加、删除、改变现有的观察者,而不会发生问题。
  • 有新类型的观察者出现时,主题的代码不需要进行修改,而是在新类中实现观察者接口,然后注册为观察者。
  • 我们可以独立的复用主题或观察者。

模式结构:

  • Subject: 目标——接口,声明了注册、删除具体观察者的函数。
  • ConcreteSubject:具体目标——具体类,实现了Subject接口的函数,并包含具体对数据处理的方法。
  • Obsever: 观察者——接口,声明了更新数据的函数。
  • ConcreteSubject: 具体观察者——具体类,实现了Obsever接口自动更新的函数。

类图:

优缺点:

  1. 优点:
    • 可以实现表示层与数据逻辑层的分离,并定义了稳定的消息更新机制,抽象了更新接口,使得各种表示层可以作为具体观察者。
    • 在观察者与主题间构建了一种抽象的耦合。
    • 支持“广播通信”。
  2. 缺点:
    • 如果观察者的数量太多,通知到所有的观察者将会耗时很长。
    • 如果观察者与主题间存在着循环依赖的话,观察主题将会触发循环调用,可能会引起系统崩溃。
    • 观察者模式没有相应的机制使得观察者得知变化是如何发生的,而仅仅是“发生了”。

适用场景:

  1. 一个对象的改变将导致其他一个或多个对象也发生改变,而不知道具体有多少对象将发生改变,可以降低对象之间的耦合度。
  2. 一个对象必须通知其他对象,而并不知道这些对象是谁。
  3. 任何涉及到一对一或一对多的对象交互场景。