模式的定义与特点(形象介绍

观察者(Observer)模式的定义:指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属(Dependents)模式,它是对象行为型模式。

观察者模式是一种对象行为型模式,其主要优点如下。

  1. 观察者模式可以实现表示层和数据逻辑层的分离,定义了稳定的消息更新传递机制,并抽象了更新接口,使得可以有各种各样不同的表示层充当具体观察者角色。
  2. 观察者模式在观察目标和观察者之间建立一个抽象的耦合。观察目标只需要维持一个抽象观察者的集合,无须了解其具体观察者。由于观察目标和观察者没有紧密地耦合在一起,因此它们可以属于不同的抽象化层次。
  3. 观察者模式支持广播通信,观察目标会向所有已注册的观察者对象发送通知,简化了一对多系统设计的难度。
  4. 观察者模式满足 “开闭原则” 的要求,增加新的具体观察者无须修改原有系统代码,在具体观察者与观察目标之间不存在关联关系的情况下,增加新的观察目标也很方便。

它的主要缺点如下。

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

    模式的结构与实现

    实现观察者模式时要注意具体目标对象和具体观察者对象之间不能直接调用,否则将使两者之间紧密耦合起来,这违反了面向对象的设计原则。

    1. 模式的结构

    观察者模式的主要角色如下。

  4. 抽象主题(Subject)角色:也叫抽象目标类,它提供了一个用于保存观察者对象的聚集类和增加、删除观察者对象的方法,以及通知所有观察者的抽象方法。

  5. 具体主题(Concrete Subject)角色:也叫具体目标类,它实现抽象目标中的通知方法,当具体主题的内部状态发生改变时,通知所有注册过的观察者对象。
  6. 抽象观察者(Observer)角色:它是一个抽象类或接口,它包含了一个更新自己的抽象方法,当接到具体主题的更改通知时被调用。
  7. 具体观察者(Concrete Observer)角色:实现抽象观察者中定义的抽象方法,以便在得到目标的更改通知时更新自身的状态。

    1. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/685018/1620712585196-2c6ad131-c982-4381-982e-df9bf0f1b577.png#align=left&display=inline&height=397&margin=%5Bobject%20Object%5D&name=image.png&originHeight=462&originWidth=590&size=46404&status=done&style=shadow&width=507)

    2.实现

    语雀内容
    语雀内容

    实际应用

    【例1】利用观察者模式设计一个程序,分析“人民币汇率”的升值或贬值对进口公司进口产品成本或出口公司的出口产品收入以及公司利润率的影响。
    【例2】利用观察者模式设计一个学校铃声的事件处理程序。
    参考

    总结

    通过前面的分析与应用实例可知观察者模式适合以下几种情形。

  8. 对象间存在一对多关系,一个对象的状态发生改变会影响其他对象。

  9. 当一个抽象模型有两个方面,其中一个方面依赖于另一方面时,可将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。
  10. 实现类似广播机制的功能,不需要知道具体收听者,只需分发广播,系统中感兴趣的对象会自动接收该广播。
  11. 多层级嵌套使用,形成一种链式触发机制,使得事件具备跨域(跨越两种观察者类型)通知。

Observable 观察目标类(被观察者)Observer(观察者类)

观察者模式与发布/订阅模式区别

语雀内容 介绍