1. 观察者模式总结(C++)

1. 介绍

观察者模式:定义了一种“一对多”的依赖关系,让多个观察者对象同时监听一个对象的改变,即当该对象的状态发现改变时,会通知所有它依赖的观察者对象。观察者模式属于行为模式。

意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

主要解决:通知其他对象有一个对象的状态改变,而且同时要考虑到易用和低耦合,保证高度的协作。

何时使用:一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。

直白点,观察者模式就是构建“事件”来通知某种状态的改变。

观察者模式提供了一种对象设计,让主题和观察者之间松耦合:

  • 运行时我们用新的观察者取代现有的观察者,主题不会受到影响;
  • 有新类型的观察者出现时,主题代码不需要更改;
  • 可以轻易地独立使用或复用主题或者观察者;
  • 改变主题或者观察者的任何一方都不会影响另一方。

2. UML

简单的UML图可以表示如下:
1557897-20181209225342293-24506339.png

观察者模式定义了四种角色:抽象主题、具体主题、抽象观察者、具体观察者。

抽象主题(Subject):该角色是一个抽象类或接口,定义了增加、删除、通知观察者对象的方法。

具体主题(ConcreteSubject):该角色继承或实现了抽象主题,定义了一个集合存入注册过的具体观察者对象,在具体主题的内部状态发生改变时,给所有注册过的观察者发送通知。

抽象观察者(Observer):该角色是具体观察者的抽象类,定义了一个更新方法。

具体观察者(ConcrereObserver):该角色是具体的观察者对象,在得到具体主题更改通知时更新自身的状态。

C++中具体存在的类各你的代码设计有关,可能某个类同时承担抽象主题和具体主题,或者抽象观察者和具体观察者的角色。

3. 具体实例

首先观察者类:

class Observer 
{ public: virtual void OnUpdata() = 0; 
};class AObserver : public Observer
{ public: virtual void OnUpdata() {std::cout << "-------OnUpdata----A----";}
};class BObserver : public Observer
{ public: virtual void OnUpdata() {std::cout << "-------OnUpdata----B----";}
};

然后主题类:

class SubjectBase{
public: virtual void AddObserver(std::shared_ptr<Observer> observer) = 0; virtual void RemoveObserver(std::shared_ptr<Observer> observer) = 0; virtual void NotifyUpdate() = 0;
};class SubjectTest : public SubjectBase {
public: void AddObserver(std::shared_ptr<Observer> observer) override {observers_.push_back(observer);} void RemoveObserver(std::shared_ptr<Observer> observer) override {observers_.remove(observer)}void NotifyUpdate() override {for(auto observer : observers_)observers_->OnUpdata();}
private:std::list<std::shared_ptr<Observer> >   observers_; 
};

Chromium代码中有大量使用观察者模式,比如网络的连接、应用的启动和关闭等等。

转载于:https://www.cnblogs.com/xl2432/p/10093937.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/265247.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面经——嵌入式常见面试题总结100题(下)

更多干货推荐可以去牛客网看看&#xff0c;他们现在的IT题库内容很丰富&#xff0c;属于国内做的很好的了&#xff0c;而且是课程刷题面经求职讨论区分享&#xff0c;一站式求职学习网站&#xff0c;最最最重要的里面的资源全部免费&#xff01;&#xff01;&#xff01;点击进…

学计算机要不要护发,脱发平时应该注意什么 四个妙招教你如何防止脱发

头发一掉&#xff0c;失去的不仅仅是发丝&#xff0c;还有美丽与颜值&#xff0c;一把把辛酸泪只能往肚子里吞。秃头星人们&#xff0c;如果已经脱发了&#xff0c;日常一定要加倍注意哦&#xff0c;一些错误的护发方法不要踩坑&#xff0c;护理、食疗、良好的生活作息&#xf…

C++面向对象类的实例题目一

在一个程序中&#xff0c;实现如下要求&#xff1a; &#xff08;1&#xff09;构造函数重载 &#xff08;2&#xff09;成员函数设置默认参数 &#xff08;3&#xff09;有一个友元函数 &#xff08;4&#xff09;有一个静态函数 &#xff08;5&#xff09;使用不同的构造函数…

iframe父子页面间的关系

在hbBank项目中&#xff0c;客户信息查询使用了&#xff0c; iframe引入外界的页面&#xff0c;使用代码如下&#xff1a; <iframe id"tab-3" class"hidden" name"tab-3" marginwidth0 marginheight0 width100% src"../commomFile/othe…

面经——嵌入式软件工程师ARM体系与架构相关

参考&#xff1a;嵌入式软件工程师笔试面试指南-ARM体系与架构 作者&#xff1a;嵌入式与Linux那些事 发布时间&#xff1a; 2021-04-28 15:22:06 网址&#xff1a;https://blog.csdn.net/qq_16933601/article/details/116234673 目录 ARM体系与架构硬件基础NAND FLASH 和NOR F…

下列属于计算机人工智能应用领域的是多选题,每天五道选择题(10)

原标题&#xff1a;每天五道选择题(10)1.在Windows7操作系统中&#xff0c;磁盘维护包括硬盘检查、磁盘清理和碎片整理等功能&#xff0c;磁盘清理的目的是( )。A.提高磁盘存取速度B.获得更多磁盘可用空间C.优化磁盘文件存储D.改善磁盘的清洁度▼答案&#xff1a;B【解析】磁盘…

2013与2014之流水

2013与2014之流水 跨年之际&#xff0c;看到博客园无数园友的精彩总结&#xff0c;心里满是惭愧&#xff0c;该是反省的时候了。先记下一篇流水账&#xff0c;然后抽空补上。13年&#xff0c;留下了一些与个人心心相关的生活足迹&#xff0c;让我不得不反省&#xff1a; 1…

数独一

本质上 X-Cycle 只是 X-Chain 的特例&#xff0c;因此统称为单链。单链若由两条强链与一条弱链构成&#xff0c;就是习称的双强链&#xff0c;有摩天楼、双线风筝、鱼三种连结方式。单链若由两条强链与两条弱链构成环&#xff0c;就是习称的 X-Wing。转载于:https://www.cnblog…

2019年3月未来教育计算机二级题库,2019年3月计算机二Access考试操作模拟试题001...

2019年3月计算机二Access考试操作模拟试题001浏览次数&#xff1a; 时间&#xff1a;2019/03/28一、基本操作题在考生文件夹中有一个“Acc1.mdb”数据库。(1)在“订单”表的“订单ID”和“客户”字段之间添加“产品ID”和“数量”字段。其中&#xff0c;“产品ID”字段的类…

面经——C/C++常见面试知识点总结附面试真题

参考&#xff1a;C/C 面试题 作者&#xff1a;zhaouc 发布时间&#xff1a; 2015-02-15 15:51:00 网址&#xff1a;https://blog.csdn.net/zhaouc/article/details/43835667 参考&#xff1a;C/C常见面试知识点总结附面试真题----20210529更新 作者&#xff1a;kuweicai 发布时…

最大连续子矩阵和算法

最大连续子矩阵算法 暴力求解不可取 或许可以从 O(n)复杂度内求解最大连续子数组的算法 得到灵感 O(n2)复杂度求最大连续子矩阵和算法&#xff1a; 创建一个新矩阵sum&#xff0c;sum[i][j]存放sun[i][0-j]的和每个候选矩阵由左上角matrix[i][j]和右下角的元素matrix[p][q]确定…

MATLAB 批量改文件名称

p1dir(pos\*.png);%读取文件夹里的 所有.png格式的图片 p1是个结构体里面包含了图片的名称 创建时间等信息 [r1 c1]size(p1); %piccell(r,1); F[];%特征矩阵初始化 Labels[];%labels初始化 Postion[];%每一个检测窗口的位置初始化 i1; for i1:r1 ImgNp1(i).name; …

计算机控制课程设计体会,计算机控制技术课程设计报告

1课程设计目的…………………………………………………1页码2课程设计题目描述和要求……………………………………1页码3.课程设计报告内容……………………………………………1页码4.心得体会………………………………………………………7页码5.参考数目……………………………

Linux系统编程学习问题回顾

1、关于文件——继续学习系统io和文件io的区别&#xff0c;以及讲明白同步与互斥。关于锁&#xff0c;除了pv&#xff0c;还要继续学习自旋锁读写锁。 系统io和文件io的区别 参考博文 同步与互斥 现代操作系统基本都是多任务操作系统&#xff0c;即同时有大量可调度实体在运行…

tomcat源码 Connector

Connector容器主要负责解析socket请求&#xff0c;在tomcat中的源码位于org.apache.catalina.connector和org.apache.coyote包路径下&#xff1b;通过上两节的分析&#xff0c;我们知道了Connector是Service的子容器&#xff0c;而Service又是Server的子容器。在server.xml文件…

AppDelegate

一、基础知识 1) main.m指定了程序的入口点 UIApplicationMain(argc, argv,nil,NSStringFromClass([StartingPointAppDelegateclass])); 2) AppDelegate的入口点 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptio…

计算机应用基础期末考试要点,计算机应用基础期末复习要点.doc

PAGE 4 / NUMPAGES 5 计算机应用基础 期末复习要点 DATE \ "yyyy-M-d" 2009-1-2PAGE计算机应用基础期末复习要点基础世界上第一台电子数字计算机取名为ENIAC。美籍匈牙利数学家冯诺伊曼提出的计算机的基本工作原理是程序存储。根据计算机使用的主要元器件&#xff0c…

快速对比UART、SPI、I2C通信的区别与应用

参考&#xff1a;带你快速对比SPI、UART、I2C通信的区别与应用&#xff01; 作者&#xff1a;一口Linux 网址&#xff1a;https://mp.weixin.qq.com/s/4_RSM2jk2W6nTboO1W8HCw 电子设备之间的通信就像人类之间的交流&#xff0c;双方都需要说相同的语言。在电子产品中&#xff…

Java使用线程并发库模拟弹夹装弹以及发射子弹的过程

同样是从网上看到的一个需求&#xff0c;需求描述都在代码中。 不多说了&#xff0c;直接贴代码了。相信大家都能够看得懂的&#xff01; package cn.yw.bore;import java.util.ArrayList; import java.util.List; import java.util.concurrent.ArrayBlockingQueue; import jav…

计算机结构原理初步教案板书设计,(计算机工作原理)教学设计(教案)

《(计算机工作原理)教学设计(教案)》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《(计算机工作原理)教学设计(教案)(5页珍藏版)》请在人人文库网上搜索。1、计算机系统的基本组成教学设计基本信息学 科信息技术年 级初二教学形式多媒体教学教 师彭裕红单 位梅州市梅…