/** 当一个对象的状态发生改变时,所有依赖于它的对象都要得到通知并更新
*/#include <iostream>
#include <memory>
#include <list>
using namespace std;class Observer{
public:virtual void response() = 0;//观察者根据被观察者的通知做出的反应virtual ~Observer() { }};class BeObservered{
public:virtual void addObserver(Observer * observer) = 0;virtual void removeObserver(Observer * observer) = 0;virtual void notify() = 0;//被观察者通知每个观察者自身状态发生了改变virtual ~BeObservered(){ }
};class ConcreteBeObserved : public BeObservered{public:void addObserver(Observer * observer){shared_ptr<Observer> observer_ptr(observer);observers.push_back(observer_ptr);}void removeObserver(Observer * observer){for(auto iter = observers.begin(); iter != observers.end(); ++iter){if((*iter).get() == observer){observers.remove(*iter);return;}}}void notify(){for(auto iter = observers.begin(); iter != observers.end(); ++iter){(*iter).get()->response();}}
private:list<shared_ptr<Observer>> observers;
};class Observer1 : public Observer{void response() { cout << "Observer1 Receive Change" <<endl; }
};class Observer2 : public Observer{void response() { cout << "Observer2 Receive Change" <<endl; }
};class Observer3 : public Observer{void response() { cout << "Observer3 Receive Change" <<endl; }
};int main()
{cout << "Hello World!" << endl;Observer * concreteobserver1 = new Observer1;Observer * concreteobserver2 = new Observer2;Observer * concreteobserver3 = new Observer3;BeObservered * concreteBeObservered = new ConcreteBeObserved;concreteBeObservered->addObserver(concreteobserver1);concreteBeObservered->addObserver(concreteobserver2);concreteBeObservered->addObserver(concreteobserver3);//发生改变concreteBeObservered->removeObserver(concreteobserver2);concreteBeObservered->notify();delete concreteBeObservered;concreteBeObservered = nullptr;return 0;
}

Observer/Event相关推荐

  1. 05Observer/Event(观察者)模式

    技术交流QQ群:1027579432,欢迎你的加入! 1.Observer/Event(观察者)模式动机 在软件构建过程中,我们需要为某些对象建立一种"通知依赖关系"-- 一个对象 ...

  2. C++设计模式 之 “组件协作”模式:Template Method、Strategy、Observer

    "组件协作"模式: #现代软件专业分工之后的第一个结果是"框架与应用程序的划分","组件协作"模式通过晚期绑定,来实现框架与应用程序之间的松 ...

  3. C++设计模式 - 观察者模式(Observer)

    组件协作模式: 现代软件专业分工之后的第一个结果是"框架与应用程序的划分","组件协作"模式通过晚期绑定,来实现框架与应用程序之间的松耦合,是二者之间协作时常用 ...

  4. 03Template Method模式

    技术交流QQ群:1027579432,欢迎你的加入! 1.从封建角度变化对23种设计模式分类 组件协作:Template Method.Strategy.Observer/Event 单一职责:Dec ...

  5. 其他系统 对外接口设计_设计模式分类及设计原则

    点击蓝字,关注我们 01 概述 设计模式的基础是:多态. 学习设计模式将有助于更加深入地理解面向对象思想,让你知道: 1.如何将代码分散在几个不同的类中? 2.为什么要有"接口"? ...

  6. RxSwift学习--核心逻辑再探

    前言 通过上一篇内容RxSwift学习--核心逻辑初探,对RxSwift有了些初步的认知,下面通过源码来看一下RxSwift到底有多骚 RxSwift核心逻辑再探 先把上篇中的例子代码搬过来: //第 ...

  7. 状态模式的介绍及状态机模型的函数库javascript-state-machine的用法和源码解析

    文章大体就两部分: 状态模式 状态机模型的函数库javascript-state-machine的用法和源码解析 场景及问题背景: 我们平时开发时本质上就是对应用程序的各种状态进行切换并作出相应处理. ...

  8. C++设计模式(转)

    在简书看到CharlesW同学学习设计模式的笔记,感觉很有意思(单身狗的妄想),转载下. 转载:https://www.jianshu.com/p/082662126bdd 好的软件设计是多用代码复用 ...

  9. Template methed

    从目的来看 创建型(Creational)模式:将对象的部分创建工作 延迟到子对象类或者其他对象,从而应对需求变化为对象创建具体实现类型引来的冲击. 结构性(Structural)模式:通过类继承或者 ...

最新文章

  1. 【怎样写代码】参数化类型 -- 泛型(一):泛型概述
  2. Android Chromium WebView Crash
  3. 举行可衡量自动行驶车未来发展的“智能模型车竞赛大会” 2018
  4. Linux下CMake简明教程(八) 添加编译选项
  5. linux——文件输入输出管理
  6. 深度学习方法:受限玻尔兹曼机RBM(三)模型求解,Gibbs sampling
  7. css超出隐藏显示省略号
  8. Windows 11 小技巧- 安装
  9. 网站繁简体切换(二)
  10. 个人作业week7——前端开发感想总结
  11. C1. Skyscrapers (从easy到hard)
  12. 如何对word中不同页面设置不同页眉页脚
  13. 工业类计算机主板维修,工控机电脑主板坏了如何维修
  14. 一车abs线路怎么量_汽车ABS传感器怎么测量好坏?
  15. IPFS和Filecoin的优势在哪里?
  16. 22个应届生word简历模板
  17. 安卓 14 可自定义锁屏时钟尺寸、颜色和透明度
  18. P12:Redux进阶-将组件UI和业务逻辑进行拆分
  19. JVM 基础知识:不积跬步,无以至千里
  20. TeXstudio 文字下方全是红色波浪线

热门文章

  1. Java线程实现抢火车票
  2. 深入浅出:全面解析服务器基础知识
  3. CAN总线和Ethernet以太网的接线对比
  4. 任何一句话都可以品味一辈子
  5. 《Ansible语法篇:剧本对象关键字之until》
  6. 数据库三大范式(通俗理解)
  7. java串口调试助手_基于 QML的 串口调试助手
  8. java音乐网站 的主要任务和目的_基于Javaweb音乐网站设计与实现.doc
  9. Jmeter之HTTP请求详解
  10. 2K超高清曲面屏显示器,非凡1500R曲面柔性屏