观察者模式(Observer Pattern)

一、概念

观察者模式(Observer Pattern)又称为发布/订阅(Publish/Subscribe)模式,在对象之间定义了一对多的依赖关系,当一个对象改变状态,依赖它的对象会收到通知并自动更新.

  • 观察者模式无外乎2个操作,观察者订阅自己关心的主题(Subject)和主题有数据变化后通知观察者们。
  • 核心:那就是一定有一个地方存放了所有的观察者,然后在事件发生的时候,遍历观察者,调用它们的回调函数。
  • 实际生产过程中,观察者模式往往用消息中间件来实现,如果要实现单机观察者模式,可以使用Guava 中的 EventBus,它有同步实现也有异步实现,本文主要介绍设计模式,就不展开说了。

 多个订阅者、客户称之为 观察者; 需要同步给多个订阅者的数据封装到对象中,称之为 目标.

二、参与者

  • 抽象被观察者角色/抽象主题角色/抽象发布者(Abstract Subject): 一般用一个抽象类和接口来实现。 定义了增加、删除以及通知观察者对象的方法,职责就是管理和通知观察者持有观察者对象的集合

  • 具体被观察者角色具体/主题角色/具体发布者(ConcreteSubject): 一般继承抽象被观察者,实现自己本身的业务逻辑,当主题状态发生改变时,向所有注册过的观察者发起通知。

  • 抽象观察者角色/抽象订阅者(Abstract Observer): 为所有的具体观察者定义在收到通知时更新自己的方法

  • 具体观察者角色/具体订阅者(Concrete Observer): 实现抽象观察者角色,观察者接收到消息后,即进行update(更新方法)操作,对接收到的数据进行处理。

  • Client 用户

三、代码例子

假设《Star War》游戏快要发售了我们想店铺一到货游戏就立刻通知我们,所以我们给店铺留下自己的联系方式。我们都想在一到货就拿到游戏,但是由于我们每个人到店铺的距离有区别,所以去的交通方式有不同这可以看做每个人对同一通知不同的处理方法。

  • 抽象被观察者角色/抽象主题角色/抽象发布者(Abstract Subject):AbstractSubject

  • 具体被观察者角色具体/主题角色/具体发布者(ConcreteSubject): ConcreteSubject

  • 抽象观察者角色/抽象订阅者(Abstract Observer): AbstractObserver

  • 具体观察者角色/具体订阅者(Concrete Observer):ConcreteObserver

四、UML图

 

五、优缺点

(一)优点

  1. 观察者和被观察者是抽象耦合的。
  2. 建立一套触发机制。

(二)缺点

  1. 如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。
  2. 如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。
  3. 观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。
  4. 多个观察者不容易调试
  5. 通知默认是顺序执行的,一个观察者阻塞,会影响到整体效率,一般使用异步的方法避免
posted @ 2022-12-11 10:50  ImreW  阅读(33)  评论(0编辑  收藏  举报