设计模式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:观察者模式
参考大话设计模式; 详细内容参见大话设计模式一书第十四章,该书使用C#实现,本实验通过C语言实现。 观察者模式又叫做发布-订阅(Publish/Subscribe)模式。 观察者模式定义了一种一对多的依赖关系,让多个观察…...
l1和l2接口如何进行编写?一定要掌握这几个元素
在这个大数据时代,很多地方都需要用到l1和l2接口,l1和l2接口在应用程序与数据库之间起着桥梁的作用,是实现数据的整合与共享的重要帮手。 l1和l2接口适用于各行各业,应用场景的不断拓展,l1和l2接口的发展也兴起&#…...
GAMES101作业7及课程总结(重点实现多线程加速,微表面模型材质)
目录闲言碎语最终全部效果展示(均为10241024512ssp)课程总结与理解(Path Tracing)框架梳理任务一:迁移相关代码任务二:实现path tracing任务三:多线程加速(包括其他加速的小trick&am…...
面试题(二十四)数据结构与算法
9.1哈希 请谈一谈,hashCode() 和equals() 方法的重要性体现在什么地方? 考察点:JAVA哈希表 参考回答: Java中的HashMap使用hashCode()和equals()方法来确定键值对的索引,当根据键获取值的时候也会用到这两个方法。…...
【HAL库】STM32CubeMX开发----STM32F407----Uart串口接收空闲中断
一、Uart串口接收空闲中断----详解 首先介绍串口通信的数据传输方式,这样后面的Uart串口空闲中断能更好的理解。 Uart串口通信----数据传输方式 串口通信的数据由发送设备通过自身的TXD接口传输到接收设备得RXD接口。 一个字符一个字符地传输,每个字符…...
Qt_文件操作
本文包含以下内容: 文件操作 基本介绍:ini文件:csv文件:代码功能文件读写:1.1 读取文件1.1.1按行读取1.1.2整体读取1.2 写入文件2. 文件信息读取3. 文件夹的创建4. 获取文件夹下所有的文件5. 获取文件夹及子文件夹下所有的文件用树的方式在界面显示文件夹目录基本介绍: …...
int和Integer有什么区别?
第7讲 | int和Integer有什么区别? Java 虽然号称是面向对象的语言,但是原始数据类型仍然是重要的组成元素,所以在面试中,经常考察原始数据类型和包装类等 Java 语言特性。 今天我要问你的问题是,int 和 Integer 有什么…...
Axure 9 收录不同效果的制作过程
效果类别 一、默认选中实现单选效果 1、默认选中 点击组件,右键选择selected字样; 2、实现单选效果 点击所有组件,右键选择selected group,填好命名,并设置选中时的组件样式;选择其中一个组件…...
[Datawhale][CS224W]图神经网络(一)
目录一、导读1.1 当前图神经网络的难点1.2 图神经网络应用场景及对应的相关模型:1.3 图神经网络的应用方向及应用场景二、图机器学习、图神经网络编程工具参考文献一、导读 传统深度学习技术,如循环神经网络和卷积神经网络已经在图像等欧式数据和信号…...
【Android实现16位灰度图数据转RGB数据并以bitmap格式显示】
Android实现16位灰度图数据转RGB数据并以bitmap显示(单通道Gray数据转三通道RGB数据并显示) 需求发现问题解决方案需求 问题需求:项目上需要实现将深度相机传感器给出的数据实时显示出来的功能。经过了解得知,传感器给出的数据为16位灰度图数据,即16位数据表示一个像素的…...
uni-app②
文章目录二、微信小程序简介(一)文档相关开发者工具使用小程序代码构成小程序基本操作三、uniapp 开发规范uniapp 开发环境开发工具下载 HBuilderX工程搭建项目运行浏览器运行四、组件基础组件基础组件列表组件公共属性集合扩展组件自定义组件UNI-ICON五…...
FFmpeg视频处理
目录 1. Ubuntu(wsl)安装 ffmpeg 2. ffmpeg查看指令 3. ffmpeg查看媒体文件信息 4. ffmpeg基础操作指令 5. ffmpeg视频抽帧 5.1 基于时间抽取帧 5.2 两种抽帧方式 5.3 视频流抽帧 5.4 视频批量抽帧 6. ffmpeg更改视频播放速度 7. ffmpeg视频格…...
FreeRTOS任务通知 | FreeRTOS十二
目录 说明: 一、任务通知 1.1、什么是任务通知 1.2、任务通知优势与劣势 1.3、任务通知值的更新方式 1.4、任务通知值状态 1.5、任务通知状态 1.6、任务通知方式类型 二、任务通知相关API函数 2.1、常用的发送通知API函数 2.2、带通知值的发送通知函数 …...
CentOS搭建博客typecho
Ubuntu搭建博客typecho_Dyansts的博客-CSDN博客 见过这样的文章展示页面吗? 详细视频安装教程: 9分钟快速搭建typecho博客,让你不再烦恼_哔哩哔哩_bilibili 现在就把他搭建出来 展示页面:Hello World 其他的插件:…...
湖南中创教育PMP如何实施风险应对,避免产生投诉
一、评估风险 评估风险影响的直接或间接价值 面临的潜在威胁,威胁发生的可能性有多大? 威胁一旦发生,损失是多大? 评估承受风险的能力 采取怎样的措施才能将损失降到最低,甚至为零 二、规划风险 对识别出来的风险进行分组或分类 确定…...
Urho3D子系统
通过使用函数RegisterSubsystem(),任何对象都可以作为子系统注册到上下文中。然后,通过调用GetSubsystem(),同一上下文中的任何其他对象都可以访问它们。每个对象类型只能有一个实例作为子系统存在。 发动机初始化后,以下子系统将…...
无线网络术语总结
学习802.11协议,其中有一些英文缩略词,这里做一下总结与记录。 学习资料:知乎徐方鑫 802.11相关文章 802.11协议精读3:CSMA/CD与CSMA/CA - 知乎 (zhihu.com) 无线网络术语缩写全称中文含义APAccessPoint无线访问节点用于无线网络…...
海卡和海派有什么区别
一、海卡和海派有什么区别 海派和海卡实际上就是快船和慢船的区别。都是头程选用海运的方式,海派是到海港海关清关拆柜后,尾程配送是采用快递配送。而海卡则是到海港海关清关拆柜后,尾程选用货车配送。1、海派比较适用于小件货物 海派是海运抵…...
vue3学习资料整理
一、一个后端程序员为什么要学习前端? 1.网上找到的学习理由 《Java后端的我也要学Node.js 了》 https://blog.csdn.net/yusimiao/article/details/104689007 《nodejs后端开发的优缺点(nodejs的概念与特征详解)》 https://www.1pindao.co…...
Linux基础语法进阶版
Linux基础语法 查看文件内容指令 touch 主要是修改文件时间,多用创建文件 -a #只更改访问时间 -m #只更改修改时间 -c --no-create#不创建任何文件cat 展示小文件内容 -b #对于非空输出行编号 -n #对于所有行输出编号 -E #在每行结束处显示"$" -A #展示所…...
终极Mac菜单栏整理指南:用Ice让你的桌面从此清爽高效
终极Mac菜单栏整理指南:用Ice让你的桌面从此清爽高效 【免费下载链接】Ice Powerful menu bar manager for macOS 项目地址: https://gitcode.com/GitHub_Trending/ice/Ice 你是否厌倦了Mac菜单栏上密密麻麻的图标?是否经常因为找不到需要的应用图…...
告别理论!在Spartan-6上玩转DDR3:从MIG IP核配置到UCF约束文件修改的完整避坑指南
Spartan-6 FPGA DDR3实战:从MIG配置到硬件调试的全链路解析 当你在ISE中点击"Generate"按钮完成MIG IP核配置时,真正的挑战才刚刚开始。这份指南将带你穿越从IP核生成到稳定运行的完整链路,特别聚焦那些官方文档语焉不详、网络教程…...
如何让旧款iOS设备重获新生:Legacy-iOS-Kit终极指南
如何让旧款iOS设备重获新生:Legacy-iOS-Kit终极指南 【免费下载链接】Legacy-iOS-Kit An all-in-one tool to restore/downgrade, save SHSH blobs, jailbreak legacy iOS devices, and more 项目地址: https://gitcode.com/gh_mirrors/le/Legacy-iOS-Kit Le…...
保姆级教程:用Winbox给ROS配置一线多拨,实测200M宽带叠加效果(附避坑指南)
家庭网络优化实战:Winbox配置多拨提升宽带利用率 家里装了200M宽带,但下载大文件时总觉得速度没跑满?多人同时在线看4K视频就开始卡顿?其实通过简单的路由器配置,你完全有可能突破运营商单线限制,让宽带利用…...
Betaflight飞控固件:2025年如何让你的穿越机飞行更稳定更智能?
Betaflight飞控固件:2025年如何让你的穿越机飞行更稳定更智能? 【免费下载链接】betaflight Open Source Flight Controller Firmware 项目地址: https://gitcode.com/gh_mirrors/be/betaflight 还在为穿越机飞行抖动、信号不稳定而苦恼吗&#x…...
【AI原生多任务学习实战白皮书】:SITS 2026官方未公开的5大优化范式与3类典型失效场景复盘
更多请点击: https://intelliparadigm.com 第一章:AI原生多任务学习:SITS 2026多目标优化实战技巧 在 SITS 2026 挑战赛中,AI 原生多任务学习(MTL)不再仅依赖共享特征表示,而是通过任务感知梯…...
《线性代数思维》:以代码和案例开启线性代数实用学习之旅!
《线性代数思维》介绍《线性代数思维》以代码为先导、以案例为基础,介绍了线性代数中最常用的概念,专为那些想理解并应用这些概念,而非仅抽象学习的读者设计。每一章都围绕一个现实世界的问题展开,如模拟网络流量、仿真鸟群飞行或…...
【开发实战】【memtester】嵌入式系统内存稳定性保障:从工具原理到压力测试场景全解析
1. 为什么嵌入式系统需要内存稳定性测试 在嵌入式产品量产前,内存稳定性测试是硬件验证中最容易被忽视却至关重要的环节。我曾参与过一个智能家居网关项目,设备在实验室运行一切正常,但批量部署后却频繁出现随机重启。经过两周的排查…...
英雄联盟Akari助手:5大核心功能解决游戏中的常见痛点
英雄联盟Akari助手:5大核心功能解决游戏中的常见痛点 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 还在为英雄联盟游戏中的繁琐操…...
手把手教你用STM32F103C8T6(正点原子mini板)驱动SHT31温湿度传感器(附完整工程)
从零玩转STM32F103C8T6与SHT31温湿度传感器实战指南 当你第一次拿到正点原子Mini开发板和SHT31传感器时,是否曾被密密麻麻的引脚和陌生的术语吓退?别担心,这篇文章将用最接地气的方式,带你完成从硬件连接到数据采集的全过程。不同…...
