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

【C++基础】观察者模式(“发布-订阅”模式)

  本文参考:观察者模式 - 摩根斯 | 爱编程的大丙

观察者模式允许我们定义一种订阅机制,可在对象事件发生时通知所有的观察者对象,使它们能够自动更新。观察者模式还有另外一个名字叫做“发布-订阅”模式。

发布者:

添加订阅者,将所有的订阅者存储起来
删除订阅者,将其从订阅者列表中删除
将消息发送给订阅者(发通知)

下面举一个生动的例子:

NewsAgency是一个抽象类,表示发布者,其派生类为 Morgans和Gossip,代表不同的两个报社

NewAgency.h

#pragma once
#include <string>
#include <list>using namespace std;//声明订阅者类
class Observer;class NewsAgency
{
public:void attach(Observer* ob);  //添加订阅者void deatch(Observer* ob);  //删除订阅者virtual void notify(string msg) = 0;  //通知list中的所有订阅者virtual ~NewsAgency() {};   //析构protected:list<Observer*> m_list;   //存储订阅者对象
};class Morgans :public NewsAgency
{
public:void notify(string msg) override;
};class Gossip :public NewsAgency
{
public:void notify(string msg) override;
};

 在NewsAgency.cpp,重写子类的虚函数。

#include "NewsAgency.h"
#include "Observer.h"
#include <iostream>void NewsAgency::attach(Observer* ob)
{m_list.push_back(ob);
}void NewsAgency::deatch(Observer* ob)
{m_list.remove(ob);
}void Morgans::notify(string msg)
{cout << "摩根斯新闻社报纸的订阅者一共有" << m_list.size()  << endl;for (const auto& item : m_list){item->update(msg);	// 订阅者类的定义在下面}
}void Gossip::notify(string msg)
{cout << "八卦新闻社报纸的订阅者一共有 " << m_list.size() << endl;for (const auto& item : m_list){item->update(msg);}}

订阅者(也可称为观察者):

 Observer.h

首先给所有的观察者定义一个抽象的基类。

然后子类在各自的类中分别重写了update()这个状态更新函数

#pragma once
#include <string>
#include <iostream>
#include "NewsAgency.h"//抽象的订阅者类
class Observer
{
public://需要通过构造函数给观察者类提供一个信息的发布者//通过发布者对象将观察者对象存储了起来,这样就可以收到发布者推送的消息了。Observer(string name, NewsAgency* news):m_name(name), m_news(news){m_news->attach(this);}//观察者取消订阅,取消之后将不再接收订阅消息。void unsubscribe(){m_news->deatch(this);}//观察者得到最新消息之后,用于更新自己当前的状态。virtual void update(string msg) = 0;virtual ~Observer() {};protected:string m_name;NewsAgency* m_news;
};class Dragon :public Observer
{
public:using Observer::Observer;void update(string msg) override{cout<< "路飞的老爸革命军龙收到消息: " << msg << endl;}
};class Shanks : public Observer
{
public:using Observer::Observer;void update(string msg) override{cout << "路飞的引路人红发香克斯收到消息: " << msg << endl;}
};class Bartolomeo : public Observer
{
public:using Observer::Observer;void update(string msg) override{cout << "路飞的头号粉丝巴托洛米奥收到消息: " << msg << endl;}
};

main函数:

#include <iostream>
#include "NewsAgency.h"
#include "Observer.h"using namespace std;int main()
{Morgans* ms = new Morgans;Gossip* gossip = new Gossip;Dragon* dragon = new Dragon("蒙奇·D·龙", ms);Shanks* shanks = new Shanks("香克斯", ms);Bartolomeo* barto = new Bartolomeo("巴托洛米奥", gossip);ms->notify("蒙奇·D·路飞成为新世界的新的四皇之一, 赏金30亿贝里!!!");cout << "======================================" << endl;gossip->notify("女帝汉库克想要嫁给路飞, 给路飞生猴子, 哈哈哈...");delete ms;delete gossip;delete dragon;delete shanks;delete barto;}

最后总结一下观察者模式的应用场景:
当一个对象的状态发生变化,并且需要改变其它对象的时候;或者当应用中一些对象必须观察其它对象的时候可以使用观察者模式。

相关文章:

【C++基础】观察者模式(“发布-订阅”模式)

本文参考&#xff1a;观察者模式 - 摩根斯 | 爱编程的大丙 观察者模式允许我们定义一种订阅机制&#xff0c;可在对象事件发生时通知所有的观察者对象&#xff0c;使它们能够自动更新。观察者模式还有另外一个名字叫做“发布-订阅”模式。 发布者&#xff1a; 添加订阅者&…...

从业多年,我总结出软件测试工程师必须掌握的技能,你不可错过!

经常会有小伙伴询问&#xff1a;“测试工程师有哪些必须要掌握的技能&#xff1f;”这是一个非常大的课题&#xff0c;因为每个人从事的行业不同、岗位不同&#xff0c;需要掌握的技能自然也不一样。 今天小编就从不同岗位、不同行业两个大方面&#xff0c;来讲讲软件测试工程师…...

【nerfStudio】5-nerfStudio导出3D Mesh模型

几何图形的导出 在这里我们将介绍如何从nerfstudio中导出点云和网格。您将使用的主要命令是ns-export。我们将点云导出为.ply文件,纹理网格导出为.obj文件。 导出网格 1. TSDF融合 TSDF(截断有符号距离函数)融合是一种使用深度图像提取表面网格的算法。此方法适用于所有…...

重要公告|投票委托已经上线,应该如何选择社区代表?

社区代表是Token持有者委托投票权的个人或团体&#xff0c;可以代表Token持有者在Moonbeam治理中投票。委托是可选的&#xff0c;允许代表在治理过程中代表更大比例的Token和Token持有者。相比社区代表&#xff0c;不愿投票的Token持有者可以将投票权委托给社区代表&#xff0c…...

【操作系统】聊聊进程、线程、协程

进程内部有那些数据 为什么创建进程的成本高 进程和线程 进程是资源分配的基本单位&#xff0c;而线程是程序执行的基本单位&#xff0c;一个是从资源分配的角度看&#xff0c;另一个是执行角度。 那么进程和程序的区别是什么&#xff1f; 程序&#xff0c;一段代码&#xff…...

springboot 下 activiti 7会签配置与实现

流程图配置 会签实现须在 userTask 节点下的 multi instance 中配置 collection 及 completion condition; collection 会签人员列表&#xff1b;element variable 当前会签变量名称&#xff0c;类似循环中的 item;completion condition: 完成条件。 ${taskExecutionServiceIm…...

RK3399平台开发系列讲解(内核调试篇)spidev_test工具使用

🚀返回专栏总目录 文章目录 一、环境二、执行测试三、回环测试四、字节发送测试五、32位数据发送测试沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 在 Linux 系统上,“spidev_test” 是一个用于测试和配置 SPI(Serial Peripheral Interface)设备的命令行工具。…...

点云从入门到精通技术详解100篇-自适应点云局部邻域特征的特征提取与配准(续)

目录 3.4 深度相机误差建模 3.5 实验结果及分析 3.5.1 TOF 相机平面畸变校正 3.5.2 TOF 相机深度误差校正...

VBA技术资料MF52:VBA_在Excel中突出显示前 10 个值

【分享成果&#xff0c;随喜正能量】一言之善&#xff0c;重于千金。善良不分大小&#xff0c;有时候你以为的一句话&#xff0c;小小的举手之劳&#xff0c;也可能就是别人的救赎&#xff01;不要吝啬你的善良&#xff0c;因为你永远不知道那小小的善良能给多少人带来光明。。…...

leetcode做题笔记134. 加油站

在一条环路上有 n 个加油站&#xff0c;其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车&#xff0c;从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发&#xff0c;开始时油箱为空。 给定两个整数数组 gas 和 cost &…...

Allegro166版本如何在颜色管理器中实时显示层面操作指导

Allegro166版本如何在颜色管理器中实时显示层面操作指导 在用Allegro166进行PCB设计的时候,需要在颜色管理器中频繁的开关层面。但是166不像172一样在颜色管理器中可以实时的开关层面,如下图 需要打开Board Geometry/Soldermask_top层,首先需要勾选这个层面,再点击Apply即…...

纷享销客入选中国信通院《高质量数字化转型产品及服务全景图》

近期&#xff0c;在中国信息通信研究院主办的“2023数字生态发展大会”暨中国信通院“铸基计划”年中上&#xff0c;重磅发布了《高质量数字化转型产品及服务全景图&#xff08;2023&#xff09;》&#xff0c;纷享销客凭借先进的技术能力和十余年客户业务场景应用理解&#xf…...

C高级 DAY4

一、分支语句 case ...in语句 shell中的switch语句 case $变量名 in常量1)语句;; ------->类似于C中break的作用&#xff0c;;;除了最后一条分之外&#xff0c;都不能省略常量2)语句;; 常量n)语句;;*) ------->类似于C中default&#xff0c;但…...

C高级day4

作业 实现一个对数组求和的函数&#xff0c;数组通过实参传递给函数 写一个函数&#xff0c;输出当前用户的uid和gid&#xff0c;并使用变量接收结果 思维导图...

Java8-17 --- idea2022

目录 一、idea官网 二、使用idea编写hello world 三、查看工程中的JDK配置信息 四、详细设置 4.1、显示工具栏 4.2、默认启动项目配置 4.3、取消自动更新 4.4、选择整体主体与背景图 4.5、设置编辑器主题样式 4.5.1、编辑器主题 4.5.2、字体大小 4.5.3、修改注…...

Mybatis---增删改查

目录 一、添加用户 &#xff08;1&#xff09;持久层接口方法 &#xff08;2&#xff09;映射文件 &#xff08;3&#xff09;测试方法 二、修改用户 &#xff08;1&#xff09;持久层接口方法 &#xff08;2&#xff09;映射文件 &#xff08;3&#xff09;测试方法 …...

开机性能-如何抓取开机systrace

一、理论 1.背景 抓取开机 trace 需要使用 userdebug 版本&#xff0c;而我们测试开机性能问题时都要求使用 user 版本&#xff0c;否则会有性能损耗问题。因此想要在抓取开机性能trace 时&#xff0c;需要在 user 版本上打开 atrace 功能之后才能抓取 trace&#xff0c;默认 …...

VBA技术资料MF54:VBA_EXCEL实时获取鼠标位置

【分享成果&#xff0c;随喜正能量】若人散乱心&#xff0c;乃至以一花&#xff0c;供养于画像&#xff0c;渐见无数佛。所以发一幅释迦牟尼佛像&#xff0c;与同修善友一起每日在微博上供养&#xff0c;只要有供养之心&#xff0c;便可积累功德。以此回向&#xff0c;愿求者如…...

模电课程设计

主要内容跟本科实验关系很大&#xff0c;可以用来借鉴。 包含文件有&#xff1a;实验报告、Multisim仿真文件&#xff0c;资料很全&#xff0c;有问题可以私信 目录 1、模电课设&#xff1a;用Multisim简单了解二极管 2、模电课设&#xff1a;用Multisim简析三极管与场效应…...

【2023研电赛】兆易创新命题三等奖: 低成本单母线电流永磁同步无感驱动器

本文为2023年第十八届中国研究生电子设计竞赛兆易创新企业命题三等奖以及决赛最佳论文奖分享&#xff0c;参加极术社区的【有奖活动】分享2023研电赛作品扩大影响力&#xff0c;更有丰富电子礼品等你来领&#xff01;&#xff0c;分享2023研电赛作品扩大影响力&#xff0c;更有…...

ES6从入门到精通:前言

ES6简介 ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的重大更新&#xff0c;引入了许多新特性&#xff0c;包括语法糖、新数据类型、模块化支持等&#xff0c;显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

Docker拉取MySQL后数据库连接失败的解决方案

在使用Docker部署MySQL时&#xff0c;拉取并启动容器后&#xff0c;有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致&#xff0c;包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因&#xff0c;并提供解决方案。 一、确认MySQL容器的运行状态 …...

《Docker》架构

文章目录 架构模式单机架构应用数据分离架构应用服务器集群架构读写分离/主从分离架构冷热分离架构垂直分库架构微服务架构容器编排架构什么是容器&#xff0c;docker&#xff0c;镜像&#xff0c;k8s 架构模式 单机架构 单机架构其实就是应用服务器和单机服务器都部署在同一…...

【HarmonyOS 5】鸿蒙中Stage模型与FA模型详解

一、前言 在HarmonyOS 5的应用开发模型中&#xff0c;featureAbility是旧版FA模型&#xff08;Feature Ability&#xff09;的用法&#xff0c;Stage模型已采用全新的应用架构&#xff0c;推荐使用组件化的上下文获取方式&#xff0c;而非依赖featureAbility。 FA大概是API7之…...

针对药品仓库的效期管理问题,如何利用WMS系统“破局”

案例&#xff1a; 某医药分销企业&#xff0c;主要经营各类药品的批发与零售。由于药品的特殊性&#xff0c;效期管理至关重要&#xff0c;但该企业一直面临效期问题的困扰。在未使用WMS系统之前&#xff0c;其药品入库、存储、出库等环节的效期管理主要依赖人工记录与检查。库…...

[拓扑优化] 1.概述

常见的拓扑优化方法有&#xff1a;均匀化法、变密度法、渐进结构优化法、水平集法、移动可变形组件法等。 常见的数值计算方法有&#xff1a;有限元法、有限差分法、边界元法、离散元法、无网格法、扩展有限元法、等几何分析等。 将上述数值计算方法与拓扑优化方法结合&#…...