当前位置: 首页 > news >正文

设计模式C++实现11:观察者模式

参考大话设计模式;

详细内容参见大话设计模式一书第十四章,该书使用C#实现,本实验通过C++语言实现。

观察者模式又叫做发布-订阅(Publish/Subscribe)模式。

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。[DP] 

一 学习测试代码 

书上的模式学习图

 我自己的测试UML图

测试代码:

#include <iostream>
#include <list>
using namespace std;class guanchazhe{
public:virtual void update() = 0;
};class xiaozhang :public guanchazhe{
public:virtual void update(){cout << "小张收到" << endl;}
};class xiaowang :public guanchazhe{
public:virtual void update(){cout << "小王收到" << endl;}
};class tongzhizhe{
protected:list<guanchazhe*> gcz_list;
public:void attach(guanchazhe *gcz){gcz_list.push_back(gcz);}void detech(guanchazhe *gcz){gcz_list.remove(gcz);}virtual void Notify(){list<guanchazhe*>::iterator it;for(it = gcz_list.begin();it != gcz_list.end();it++){guanchazhe *gcz = (guanchazhe *)*it;gcz->update();}}
};class laoban:public tongzhizhe
{
public:virtual void Notify(){cout << "我是老板" << endl;tongzhizhe::Notify();}
};class mishu:public tongzhizhe
{
public:virtual void Notify(){cout << "我是秘书" << endl;tongzhizhe::Notify();}
};int main(void)
{tongzhizhe *t1 = new laoban();tongzhizhe *t2 = new mishu();xiaozhang *xz = new xiaozhang();xiaowang *xw = new xiaowang();t1->attach(xz);t1->attach(xw);t1->Notify();t2->attach(xz);t2->attach(xw);t2->Notify();return 0;
}

 运行结果:

我是老板
小张收到
小王收到
我是秘书
小张收到
小王收到

二 观察者模式

我不是很喜欢这种命名,不够直观,不利于思路整理,初学还是guanchazhe,tongzhizhe这种看似很土,但是却比较容易理清思路。

观察者模式(Observer)结构图

 在上面测试中,类tongzhizhe对应Subject.
类guanchazhe对应Observer.
类laoban和xiaowang对应ConcreteSubject
类mishu和xiaowang对应ConcreteObserver.

测试代码略

三 使用函数指针模拟委托功能探讨

看书上委托的定义

 用C++来实现这两张图中的Update

1 .定义一个类叫EventHandler

2.在EventHandler中重载+运算中

3.定义个函数指针类型

4.在EventHandler定义一个链表。

聪明的你已经猜出该怎么做了吧

代码实现如下所示,写的时候发现对象的成员函数是不能直接赋值给指针的。

假设:xz.quchifan可以赋值给p1,那么p1()执行后,

cout << this->name <<  "去吃饭" << endl;

 这条代码被执行,因为没有对象调用,所示this为空this->name 使用空指针调用,段错误

证明:非静态函数不能赋值给指针。

使用函数指针实现委托的计划破产。但是从中还是可以学习C++的函数指针,重载的灵活用法。

#include <iostream>
#include <list>
using namespace std;typedef void (*update_pointer)(void);class xiaozhang{
public:string name;void quchifan(void)//去吃饭{cout << this->name <<  "去吃饭" << endl;}
};class baoan
{
public:static void quxunluo(void)//去巡逻{cout << "去巡逻" << endl;}
};class EventHandler{
public:EventHandler(){}EventHandler& operator+(update_pointer p){func_list.push_back(p);return *this;}list<update_pointer> func_list;void execute(){list<update_pointer>::iterator it;for(it = func_list.begin();it != func_list.end();it++){(*it)();}}};class tongzhizhe{
public:EventHandler update;tongzhizhe(){//update = new EventHandler();}};
int main(void)
{tongzhizhe *t = new tongzhizhe();xiaozhang xz;//update_pointer p1 = (update_pointer)(xz.quchifan);baoan ba;t->update = (t->update) + (update_pointer)(ba.quxunluo);t->update.execute();return 0;
}

运行结果:

去巡逻

小结

相关文章:

设计模式C++实现11:观察者模式

参考大话设计模式&#xff1b; 详细内容参见大话设计模式一书第十四章&#xff0c;该书使用C#实现&#xff0c;本实验通过C语言实现。 观察者模式又叫做发布-订阅&#xff08;Publish/Subscribe&#xff09;模式。 观察者模式定义了一种一对多的依赖关系&#xff0c;让多个观察…...

l1和l2接口如何进行编写?一定要掌握这几个元素

在这个大数据时代&#xff0c;很多地方都需要用到l1和l2接口&#xff0c;l1和l2接口在应用程序与数据库之间起着桥梁的作用&#xff0c;是实现数据的整合与共享的重要帮手。 l1和l2接口适用于各行各业&#xff0c;应用场景的不断拓展&#xff0c;l1和l2接口的发展也兴起&#…...

GAMES101作业7及课程总结(重点实现多线程加速,微表面模型材质)

目录闲言碎语最终全部效果展示&#xff08;均为10241024512ssp&#xff09;课程总结与理解&#xff08;Path Tracing&#xff09;框架梳理任务一&#xff1a;迁移相关代码任务二&#xff1a;实现path tracing任务三&#xff1a;多线程加速&#xff08;包括其他加速的小trick&am…...

面试题(二十四)数据结构与算法

9.1哈希 请谈一谈&#xff0c;hashCode() 和equals() 方法的重要性体现在什么地方&#xff1f; 考察点&#xff1a;JAVA哈希表 参考回答&#xff1a; Java中的HashMap使用hashCode()和equals()方法来确定键值对的索引&#xff0c;当根据键获取值的时候也会用到这两个方法。…...

【HAL库】STM32CubeMX开发----STM32F407----Uart串口接收空闲中断

一、Uart串口接收空闲中断----详解 首先介绍串口通信的数据传输方式&#xff0c;这样后面的Uart串口空闲中断能更好的理解。 Uart串口通信----数据传输方式 串口通信的数据由发送设备通过自身的TXD接口传输到接收设备得RXD接口。 一个字符一个字符地传输&#xff0c;每个字符…...

Qt_文件操作

本文包含以下内容: 文件操作 基本介绍:ini文件:csv文件:代码功能文件读写:1.1 读取文件1.1.1按行读取1.1.2整体读取1.2 写入文件2. 文件信息读取3. 文件夹的创建4. 获取文件夹下所有的文件5. 获取文件夹及子文件夹下所有的文件用树的方式在界面显示文件夹目录基本介绍: …...

int和Integer有什么区别?

第7讲 | int和Integer有什么区别&#xff1f; Java 虽然号称是面向对象的语言&#xff0c;但是原始数据类型仍然是重要的组成元素&#xff0c;所以在面试中&#xff0c;经常考察原始数据类型和包装类等 Java 语言特性。 今天我要问你的问题是&#xff0c;int 和 Integer 有什么…...

Axure 9 收录不同效果的制作过程

效果类别 一、默认选中实现单选效果 1、默认选中 点击组件&#xff0c;右键选择selected字样&#xff1b; 2、实现单选效果 点击所有组件&#xff0c;右键选择selected group&#xff0c;填好命名&#xff0c;并设置选中时的组件样式&#xff1b;选择其中一个组件&#xf…...

[Datawhale][CS224W]图神经网络(一)

目录一、导读1.1 当前图神经网络的难点1.2 图神经网络应用场景及对应的相关模型&#xff1a;1.3 图神经网络的应用方向及应用场景二、图机器学习、图神经网络编程工具参考文献一、导读 ​ 传统深度学习技术&#xff0c;如循环神经网络和卷积神经网络已经在图像等欧式数据和信号…...

【Android实现16位灰度图数据转RGB数据并以bitmap格式显示】

Android实现16位灰度图数据转RGB数据并以bitmap显示(单通道Gray数据转三通道RGB数据并显示) 需求发现问题解决方案需求 问题需求:项目上需要实现将深度相机传感器给出的数据实时显示出来的功能。经过了解得知,传感器给出的数据为16位灰度图数据,即16位数据表示一个像素的…...

uni-app②

文章目录二、微信小程序简介&#xff08;一&#xff09;文档相关开发者工具使用小程序代码构成小程序基本操作三、uniapp 开发规范uniapp 开发环境开发工具下载 HBuilderX工程搭建项目运行浏览器运行四、组件基础组件基础组件列表组件公共属性集合扩展组件自定义组件UNI-ICON五…...

FFmpeg视频处理

目录 1. Ubuntu&#xff08;wsl&#xff09;安装 ffmpeg 2. ffmpeg查看指令 3. ffmpeg查看媒体文件信息 4. ffmpeg基础操作指令 5. ffmpeg视频抽帧 5.1 基于时间抽取帧 5.2 两种抽帧方式 5.3 视频流抽帧 5.4 视频批量抽帧 6. ffmpeg更改视频播放速度 7. ffmpeg视频格…...

FreeRTOS任务通知 | FreeRTOS十二

目录 说明&#xff1a; 一、任务通知 1.1、什么是任务通知 1.2、任务通知优势与劣势 1.3、任务通知值的更新方式 1.4、任务通知值状态 1.5、任务通知状态 1.6、任务通知方式类型 二、任务通知相关API函数 2.1、常用的发送通知API函数 2.2、带通知值的发送通知函数 …...

CentOS搭建博客typecho

Ubuntu搭建博客typecho_Dyansts的博客-CSDN博客 见过这样的文章展示页面吗&#xff1f; 详细视频安装教程&#xff1a; 9分钟快速搭建typecho博客&#xff0c;让你不再烦恼_哔哩哔哩_bilibili 现在就把他搭建出来 展示页面&#xff1a;Hello World 其他的插件&#xff1a;…...

湖南中创教育PMP如何实施风险应对,避免产生投诉

一、评估风险 评估风险影响的直接或间接价值 面临的潜在威胁&#xff0c;威胁发生的可能性有多大? 威胁一旦发生&#xff0c;损失是多大? 评估承受风险的能力 采取怎样的措施才能将损失降到最低&#xff0c;甚至为零 二、规划风险 对识别出来的风险进行分组或分类 确定…...

Urho3D子系统

通过使用函数RegisterSubsystem()&#xff0c;任何对象都可以作为子系统注册到上下文中。然后&#xff0c;通过调用GetSubsystem()&#xff0c;同一上下文中的任何其他对象都可以访问它们。每个对象类型只能有一个实例作为子系统存在。 发动机初始化后&#xff0c;以下子系统将…...

无线网络术语总结

学习802.11协议&#xff0c;其中有一些英文缩略词&#xff0c;这里做一下总结与记录。 学习资料&#xff1a;知乎徐方鑫 802.11相关文章 802.11协议精读3&#xff1a;CSMA/CD与CSMA/CA - 知乎 (zhihu.com) 无线网络术语缩写全称中文含义APAccessPoint无线访问节点用于无线网络…...

海卡和海派有什么区别

一、海卡和海派有什么区别 海派和海卡实际上就是快船和慢船的区别。都是头程选用海运的方式&#xff0c;海派是到海港海关清关拆柜后&#xff0c;尾程配送是采用快递配送。而海卡则是到海港海关清关拆柜后&#xff0c;尾程选用货车配送。1、海派比较适用于小件货物 海派是海运抵…...

vue3学习资料整理

一、一个后端程序员为什么要学习前端&#xff1f; 1.网上找到的学习理由 《Java后端的我也要学Node.js 了》 https://blog.csdn.net/yusimiao/article/details/104689007 《nodejs后端开发的优缺点&#xff08;nodejs的概念与特征详解&#xff09;》 https://www.1pindao.co…...

Linux基础语法进阶版

Linux基础语法 查看文件内容指令 touch 主要是修改文件时间&#xff0c;多用创建文件 -a #只更改访问时间 -m #只更改修改时间 -c --no-create#不创建任何文件cat 展示小文件内容 -b #对于非空输出行编号 -n #对于所有行输出编号 -E #在每行结束处显示"$" -A #展示所…...

近红外染料标记小分子1628790-37-3,Cyanine5.5 alkyne,花青素CY5.5炔基

试剂基团反应特点&#xff1a;Cyanine5.5 alkyne用于点击化学标记的远红外/近红外染料炔烃。氰基5.5是Cy5.5的类似物&#xff0c;一种流行的荧光团&#xff0c;已广泛用于各种应用&#xff0c;包括完整生物体成像。在温和的铜催化化学条件下&#xff0c;该试剂可与叠氮基共轭&a…...

洛谷——P1004 方格取数

【题目描述】 设有 NN 的方格图 (N≤9)&#xff0c;我们将其中的某些方格中填入正整数&#xff0c;而其他的方格中则放入数字 0。如下图所示&#xff08;见样例&#xff09;: A 0 0 0 0 0 0 0 0 0 0 13 0 0 6 0 0 0 0 0 0 7 0 0 0 0 0 0 14 0 0…...

Linux删除软链接

不防大家试试 unlink 命令 首先我们先来创建一个文件 #mkdir test_chk #touch test_chk/test.txt #vim test_chk/test.txt (这一步随便在这个test.txt里写点东东即可) 下面我们来创建test_chk目录 的软链接 #ln-s test_chk test_chk_ln 软链接创建好了&#xff0c;我们来…...

【自然语言处理】【大模型】用于大型Transformer的8-bit矩阵乘法介绍

用于大型Transformer的8-bit矩阵乘法介绍原文地址&#xff1a;A Gentle Introduction to 8-bit Matrix Multiplication for transformers at scale using transformers, accelerate and bitsandbytes 相关博客 【自然语言处理】【大模型】用于大型Transformer的8-bit矩阵乘法介…...

设计模式之工厂模式详解和应用

目录1 工厂模式的历史由来2.简单工厂模式2.1 简单工厂模式定义2.2 简单工厂模式案例2.3 简单工厂模式相关源码2.4 简单工厂模式优缺点3 工厂方法模式3.1 工厂方法模式定义3.2 工厂方法模式案例3.3 工厂方法模式源码3.4 工厂方法模式优缺点4 抽象工厂模式4.1 抽象工厂模式定义4.…...

ArcGIS中的附件功能

从ArcGIS10起,空间数据库增加了"附件"的功能,可灵活管理与要素相关的附加信息,可以是图像、PDF、文本文档或任意其他文件类型。例如,如果用某个要素表示建筑物,则可以使用附件来添加多张从不同角度拍摄的建筑物照片。 启动附件功能 要想使用附件功能,要素类必…...

epoll单台设备支持百万并发连接

一些概念&#xff1a; linux下一切接文件&#xff0c;文件描述符fd&#xff0c;文件I/O(包含socket&#xff0c;文本文件等)&#xff0c;I/O多路复用&#xff0c;reactor模型&#xff0c;水平触发&#xff0c;边沿触发&#xff0c;多线程模型&#xff0c;阻塞和非阻塞&#xf…...

网络字节序

文章目录网络字节序网络字节序 内存中的多字节数据相对于内存地址有大端和小端之分, 磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小端之分, 网络数据流同样有大端小端之分. 网络数据流的地址统一按大端处理 发送主机通常将发送缓冲区中的数据按内存地址从低到高的…...

03- SVC 支持向量机做人脸识别 (项目三)

数据集描述: sklearn的lfw_people函数在线下载55个外国人图片文件夹数据集来精确实现人脸识别并提取人脸特征向量数据集地址: sklearn.datasets.fetch_lfw_people — scikit-learn 1.2.1 documentationPCA降维: pca PCA(n_components0.9) 数据拆分: X_train, X_test, y_tra…...

浅谈指向二维数组元素的指针变量

(1)指向数组元素的指针变量 例1.有一个3X4的二维数组,要求用指向元素的指针变量输出二维数组各元素的值. 编写程序 1 #include <stdio.h>2 int main()3 {4 int a[3][4] { 1,3,5,7,9,11,13,15,17,19,21,23 };5 int *p;6 for (p a[0]; p < a[0] 12; p) …...

昭通昭阳区城乡建设管理局网站/百度实时热点排行榜

想要在MYSQL的触发器中调用存储过程&#xff0c;但是IDE提示&#xff1a;0A000 Not allowed to return a result set from a trigger触发器代码如下&#xff1a;DELIMITER $$CREATE TRIGGER tri_ContactCompany_Insert AFTER INSERTON contactcompany FOR EACH ROW# 创建时间&a…...

做网站需要哪些技术/自助建站系统软件

量化投资是指使用数理分析、编程、建模等方式&#xff0c;通过对样本数据进行集中比对处理&#xff0c;找到数据之间的关系&#xff0c;制定量化策略&#xff0c;并使用编写的软件程序来执行交易&#xff0c;从而获得投资回报的方式。在如今的量化投资领域&#xff0c;已经有了…...

网站建设论文的部首/谷歌chrome官网

今天无意间翻了一下Hystrix代码仓库&#xff0c;无意间看到最近的一条变更&#xff0c;竟然发现Hystrix也不再进行活跃的更新了&#xff0c;停止开发新功能了&#xff01;后期只是进行维护了&#xff01;&#xff01;&#xff01;这是继Eureka之后又一个停止更新的Spring Cloud…...

上海高端网站建设服务/百度总部

雷帝网 乐天 10月11日报道苹果CEO蒂姆-库克&#xff08;Tim Cook&#xff09;今日到访今日头条&#xff0c;并与今日头条CEO张一鸣展开互动。双方显得谈笑风生。库克在今日头条的出现&#xff0c;也引起了今日头条员工的轰动&#xff0c;很多人纷纷分享库克此行的照片。不过&am…...

企业网站设计意义/我想做app推广代理

针对URL&#xff0c;使用名词而非动词 REST面向数据模型的结果是&#xff0c;每个URL都可以被识别为事物。 这意味着&#xff0c;对于由API客户端的开发人员读取和编写的“知名URL”和“查询URL”&#xff0c;应该由名词组成&#xff0c;名词是用于指定事物的自然语言。 众所周…...

用七牛做网站/seo优化报价

相关参考资料链接&#xff1a; CORDIC算法计算正余弦 cordic算法的verilog实现及modelsim仿真 CORDIC算法--流水线结构 verilog实现基于Cordic算法的双曲函数计算 FPGA数字信号处理&#xff08;十四&#xff09;Vivado Cordic IP核计算arctan xilinx cordic IP核的用法- …...