观察者模式(Observer Pattern)

模式动机

建立一种对象与对象之间的依赖关系,一个对象(观察目标)发生改变时将自动通知其他对象(观察者),其他对象将相应作出反应。而且观察者之间没有相互联系,可以根据需要增加和删除观察者,使得系统更易于扩展。

模式定义

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

模式结构

  • Subject(抽象主题接口):定义了主题类中对观察者列表的一系列操作。
  • ConcreteSubject(具体主题类)
  • Observer(抽象观察者接口):定义了观察者对主题类更新状态接受操作。
  • ConcreteObserver(具体观察者类):实现观察者接口更新主题类通知等逻辑。

模式示例

练习代码

使用环境

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

模式优点

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

    模式缺点

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

模式扩展

MVC模式

相关链接

Graphic Design Patterns

java设计模式—观察者模式

后续

接下来要在项目中实践了233,这几天大概会有一个练习的代码。(又是flag,逃……)