• 【C++】设计模式之观察者模式



    观察者模式面向的 需求是:A对象(观察者)对B对象(被观察者)的某种变化高度敏感,需要在B变化的一瞬间做出反应。

    什么是观察者模式

    指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式,它是对象行为型模式

    优点

    1、观察者和被观察者是抽象耦合的,一个目标仅仅知道他有一系列的观察者,每个都符合AbstractObserver的接口,但是不知道任何一个观察者属于哪一具体类。这样目标和观察者之间的耦合是抽象的和最小的。
    2、建立一套触发机制。支持广播通信,不像通常的请求通信,目标的发送者不需要指定它的接受者。通知被自动广播给所有已经向该目标对象登记过的有关对象。
    3、符合“开闭原则”,增加新的具体观察者无须修改原有的系统代码。

    缺点

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

    使用场合

    在以下任一情况下都可以使用观察者模式:

    当一个抽象模型有两个方面,其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立的改变和复用;
    当对一个对象的改变需要同时改变其它对象,而不知道具体有多少对象有待改变;
    当一个对象必须通知其它对象,而它又不能假定其它对象是谁;也就是说,你不希望这些对象是紧密耦合的。

    角色

    两大类(主题(被观察者)和观察者)
    四个角色:

    1. 抽象主题/抽象被观察者(Subject)角色:将所有观察者对象保存在一个集合中,可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象
    2. 具体主题/具体被观察者(ConcreteSubject)角色:该角色将有关状态存入具体观察者对象,在具体主题的内部状态发生改变时,给所有注册过的观察者发送通知
    3. 抽象观察者(Observer)角色:它定义了一个更新接口,使得在得到主题/被观察者更新时通知自己
    4. 具体观察者(ConcrereObserver)角色:实现抽象观察者定义的更新接口,以便在得到主题/被观察者更新时通知自己更新自身状态

    举例子理解,优化使用智能指针https://zhuanlan.zhihu.com/p/119308881

  • 相关阅读:
    Android模拟器中替换库和img
    贪心算法归纳
    CSS 之 posiiton:fixed 固定定位在父元素含有 tranform 属性时会失效,变成 absolute 的效果
    pgpool-II常见错误
    Python在列表中如何对多个参数进行修改
    【vue.js】文档解读【day 1】 | 模板语法1
    【mmdetection】ROIExtractor中的featmap_strides和finest_scale
    Zabbix监控
    基于微信小程序的垃圾分类系统,附源码
    Leetcode1710:卡车上的最大单元数
  • 原文地址:https://blog.csdn.net/kin_16/article/details/126544030