返回
Featured image of post 设计模式 —— 观察者模式

设计模式 —— 观察者模式

观察者模式

1. 基础概念

  • 定义:定义了对象之间的一对多依赖,这样依赖,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
  • 类图:
  • 出场嘉宾
    • 主题 (Subject):出版者、被观察者、
    • 观察者 (Observer):订阅者、
    • 具体主题 (Concrete Subject): 对主题的实现
    • 具体观察者 (Concrete Observer): 对观察者的实现

观察者模式就和报纸订阅/取消订阅、邮件订阅/取消订阅类似。 出版者(主题)+ 订阅者(观察者)=观察者模式

2. 解决什么问题?如何解决?

  • (易用、低耦合、高度协作)解决一个对象状态改变通知其他多个对象的问题。

3. 优缺点是什么?

3.1 优点

  • 支持一对多通信。
  • 符合开闭原则。【疑问???】
  • 在主题和观察者之间建立一个抽象的耦合。【抽象的耦合???】

3.2 缺点

  • 当一个主题观察者过多时,通知会比较耗费时间。
  • 主题观察者有循环依赖时,会导致循环调用。
  • 观察者无法知道变化过程,只能知道变化结果。

4. 使用场景是什么?

  • 一个对象要通知其他[多个]对象自己改变时(可能并不知道这些对象是谁);
  • 一个对象要导致其他[多个]对象自己改变时;
  • 需要创建触发链时;

5. 应用实例?

  • 天气预报服务器数据更新,客户端实时展示更新后的数据。(《Head First 设计模式》示例)
  • 电子商务网站向多个用户推送商品信息。

x. 疑问

  • 观察者如何对感兴趣的事情进行订阅、取消订阅?
    • 主题提供注册接口,以供观察者对主题进行订阅;
    • 主题提供取消订阅接口,以供观察者对主题进行取消订阅;
  • 主题如何存储观察者
    • 可存储在数组或其他数据结构中。
  • 主题如何通知观察者
    • 遍历所有观察者,一个一个进行通知。
  • mqtt是否也是观察者模式的一种实现?
  • 怎么理解开闭原则,在本模式中,哪部分符合开闭原则?
    • 开闭原则是针对来说的。

y. 拓展

  • 观察者模式有:两种模式。
    • 推:主题将变更推送观察者
    • 拉:主题通知观察者已变更,变更内容由观察者主动获取。(主题提供获取接口)
  • 开闭原则:对修改关闭,对拓展开放

z. 参考

相信美好的事情即将发生。
Built with Hugo
Theme Stack designed by Jimmy