观察者模式

Observer模式是行为模式之一,它的作用是当一个对象的状态发生变化时,能够自动通知其他关联对象,自动刷新对象状态。

Observer模式提供给关联对象一种同步通信的手段,使得某个对象与依赖它的其他对象之间保持状态同步。

角色和职责

Suject-被观察者

被观察的对象,当需要被观察的状态发生改变时,需要通知队列中所有的观察者对象。Subject需要维持(添加,删除,通知)一个观察者对象的队列列表。

ConcreteSubject

被观察者的具体实现,包含一些基本的属性状态及其他操作

Observer-观察者

接口或抽象类,当Subject的状态发生变化时,Observer对象将通过一个callback函数得到通知。

ConcreteObserver

观察者的具体实现,得到通知后将完成一些具体的业务逻辑处理

典型应用场景

  • 侦听事件驱动程序中的外部事件
  • 侦听某个对象的状态变化
  • 发布者/订阅者模型中,当一个外部事件被触发时,通知邮件列表中的订阅者

适用于:定义对象间一种一对多的依赖关系,使得每一个对象改变状态,则所有依赖它们的对象都会得到通知。

使用场景:定义一种一对多的关系,让多个观察者对象同时监听一个主题,主题对象发生变化时,会通知所有的观察者,使它们能够更新自己。

//
// Created by andrew on 2020/11/28.
//
#include <iostream>
#include <list>using namespace std;class Secretary;// 观察者
class PlayerObserver{public:explicit PlayerObserver(Secretary *secretary){this->m_secretary = secretary;}// 没有操作任何私有变量,建议使用 static 类型函数void update(const string& action){cout << "action" << action << endl;cout << "boss is coming" << endl;}private:Secretary *m_secretary;
};class Secretary{public:Secretary(){m_list.clear();}void Notify(string info){// 给所有的 观察者 发送情报for(auto it=m_list.begin();it!=m_list.end();it++){(*it)->update(info);}}void setPlayerObserver(PlayerObserver *o){m_list.push_back(o);}private:list<PlayerObserver *>m_list;
};int main(int argc, char* argv[]){Secretary *secretary = nullptr;PlayerObserver *playerObserver1 = nullptr;PlayerObserver *playerObserver2 = nullptr;secretary = new Secretary;playerObserver1 = new PlayerObserver(secretary);playerObserver2 = new PlayerObserver(secretary);secretary->setPlayerObserver(playerObserver1);secretary->setPlayerObserver(playerObserver2);secretary->Notify("boss is coming");secretary->Notify("boss in gone");delete playerObserver1;delete playerObserver2;delete secretary;cout << "observer demo" << endl;return 0;
}

23种设计模式C++源码与UML实现--观察者模式相关推荐

  1. 23种设计模式C++源码与UML实现--外观模式

    外观模式 facade模式也叫外观模式,是由GoF提出的23种设计模式中的一种,facade模式为一组具有类似功能的类群,比如类库,子系统等等,提供一个一致的简单界面.这个一致的简单的界面被称为fac ...

  2. 23种设计模式C++源码与UML实现--建造者模式

    建造者模式 代码仓库地址:建造者模式 Builder模式也叫建造者模式或者生成器模式,是由GoF提出的23种设计模式中的一种.Builder模式是一种对象创建模式之一,用来隐藏复合对象的创建过程.他把 ...

  3. 23种设计模式C++源码与UML实现--迭代器模式

    迭代器模式 Iterator模式也叫迭代模式,是行为模式之一,他把对容器种包含的内部对象的访问委让给外部类,使用Iterator按顺序进行遍历访问的设计模式. 在使用Iterator模式之前,首先应该 ...

  4. 23种设计模式C++源码与UML实现--命令模式

    命令模式 Command模式也叫命令模式,是行为设计模式的一种.Command模式通过被称为Command的类封装了对目标对象的调用行为以及调用参数. 在面向对象的程序设计中,一个对象调用另外一个对象 ...

  5. 23种设计模式C++源码与UML实现--原型模式

    原型模式 一个复杂对象,具有自我复制功能,统一一套接口. 原型模式主要面对的问题是:某些结构复杂的对象的创建工作,由于需求的变化,这些对象进场面对着剧烈的变化,但是他们却拥有比较一致的接口. 原型模式 ...

  6. 23种设计模式C++源码与UML实现--桥接模式

    桥接模式 Bridge模式,又叫做桥接模式,是构造型的设计模式之一.Bridge模式基于类的最小设计原则,通过使用封装,聚合以及继承等行为让类承担不同的责任.它的主要特点是把抽象(Abstractio ...

  7. 23种设计模式C++源码与UML实现--单例模式中的饿汉模式和懒汉模式

    单例模式 单例模式是一种对象创建模式,使用单例模式,可以保证为一个类生成唯一的实例对象.也就是说在这个程序空间该类只有一个实例对象. GoF对单例的定义:保证一个类.只有一个实例存在,同时提供对该实例 ...

  8. 23种设计模式C++源码与UML实现--解释模型

    解释模型 一些应用提供了内建的脚本或者宏语言来让用户可以定义它们能够在系统中进行的操作.Interpreter模式的目的就是使用一个解释器为用户提供一个一门定义语言的语法表示的解释器,然后通过这个解释 ...

  9. 23种设计模式C++源码与UML实现--状态模式

    状态模式 State模式也叫状态模式,是行为模式的一种,State模式允许通过改变对象的内部状态而改变对象的行为,这个对象变现的好像修改了它的类一样. 状态模式主要解决的事当控制一个对象状态的条件表达 ...

最新文章

  1. 数据库的查询,添加,修改,删除
  2. jmeter 线程执行顺序_Jmeter-线程组执行顺序控制
  3. 一个隐藏着的僵尸巨兽——Ponmocup僵尸网络
  4. php自动维护,完全禁用关闭Windows Server 2012R2自动维护功能禁用WIN2012R2自动维护
  5. 【Java】我的第一个 JAVA 程序:Hello,world!
  6. 使用CSS按比例调整图像大小? [重复]
  7. linux midi编辑,MidiEditor软件下载 MIDI音乐制作软件(MidiEditor) v3.1.0 支持Windows和Linux 英文官方版 下载-脚本之家...
  8. fileupload控件的属性_FileUpLoad控件简介.ppt
  9. Android混淆使用详解
  10. 计算机屏幕亮度一般为多少,显示器亮度对比度到底设置多少最合适?
  11. wifi文件传输linux,wifi挂载Linux文件系统
  12. 家中闲置旧电脑改装家用NAS(入门教程)
  13. noip2016普及组初赛中山市成绩表及分数线
  14. 夜光带你走进python开发 (十七)传奇语言
  15. 七代处理器装win7_7代cpu能装win7旗舰版吗?七代处理器 不能装win7的解决方法
  16. 使用汉明距离、LAB色彩空间相似性来衡量图片相似性
  17. [Python|Clothoid]Clothoid曲线(回旋曲线)与直角坐标求解的python实现
  18. 我和小伙伴在北京的租房经历
  19. 3D结构光投影测量软件 / 界面 (基于QT)
  20. Anti Arp Sniffer ARP病毒专杀工具

热门文章

  1. 字体中字号,磅值和mm之间的转换
  2. nyist -- 组队赛(一)
  3. 做中间件的这两年总结(201704-201905)
  4. LeetCode224. Basic Calculator (用栈计算表达式)
  5. easyui form提交和formdata提交记录,查看FormData对象内部的值
  6. 2017年9月18日
  7. [JSOI2007]文本生成器
  8. docker network
  9. STM32学习笔记——DMA控制器(向原子哥学习)
  10. 【推荐】JS面象对象编程视频教程