【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;}

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

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

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

相关文章

K8s上安装gitlab-ce

文章目录 K8s上安装gitlab-ce操作如下gitlab-deployment.yml K8s上安装gitlab-ce 前言   使用pv-pvc来持久化gitlab的数据&#xff0c;配置&#xff0c;日志文件。   pod启动后需要需要修改external_url然后重启pod。 操作如下 mkdir -p /mnt/data01/gitlab ctr -n k8s.…

自动驾驶多任务框架Hybridnets——同时处理车辆检测、可驾驶区域分割、车道线分割模型部署(C++/Python)

一、多感知任务 在移动机器人的感知系统&#xff0c;包括自动驾驶汽车和无人机&#xff0c;会使用多种传感器来获取关键信息&#xff0c;从而实现对环境的感知和物体检测。这些传感器包括相机、激光雷达、雷达、惯性测量单元&#xff08;IMU&#xff09;、全球导航卫星系统&am…

PSP - 蛋白质序列提取 Transformer 蛋白质语言模型 ESM2 特征

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/132888139 蛋白质语言模型 ESM (Evolutionary Scale Modeling) 是一种利用深度学习技术来预测蛋白质结构和功能的方法。ESM 通过在大规模的蛋白质…

【毕设选题】 大数据二手房数据爬取与分析可视化 -python 数据分析 可视化

# 1 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕业答辩的要求&#xff0c;这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通…

​Qt for Python 入门¶​

本页重点介绍如何从源代码构建Qt for Python&#xff0c;如果你只想安装PySide2。 与你需要运行&#xff1a;pip pip install pyside2有关更多详细信息&#xff0c;请参阅我们的快速入门指南。此外&#xff0c;您可以 查看与项目相关的常见问题解答。 一般要求 Python&#xf…

华为云使用脚本初始化Linux数据盘

初始化新挂载的磁盘 登录云服务器&#xff0c;执行以下命令获取自动初始化磁盘脚本。 wget https://ecs-instance-driver.obs.cn-north-1.myhuaweicloud.com/datadisk/LinuxVMDataDiskAutoInitialize.sh 说明&#xff1a; 若回显异常&#xff0c;请检查云服务器是否绑定弹性公…

深度学习-全连接神经网络-训练过程-模型正则与超参数调优- [北邮鲁鹏]

目录标题 神经网络中的超参数学习率超参数优化方法网格搜索法随机搜索法 超参数搜索策略粗搜索精搜索 超参数的标尺空间 神经网络中的超参数 超参数 网络结构&#xff1a;隐层神经元个数&#xff0c;网络层数&#xff0c;非线性单元选择等优化相关&#xff1a;学习率、dorpou…

EXCEL如何把一个单元格内的文本和数字分开?例如:龚龚15565 = 龚龚 15565

使用工具&#xff1a;WPS 举例&#xff1a; EXCEL如何把一个单元格内的文本和数字批量分开&#xff1f;不使用数据分列。 第一步、将第二行数据冻结 第二步、在B1、C1单元格输入需要分开的示例 第三步、点击选中B1单元格&#xff0c;输入快捷键【CTRLE】进行填充。B2单元格也是…

C++ - map 和 set 使用介绍

简介 其实在map 和 set 的底层实现当中有差不多一半的 结构是使用 二叉搜索树来实现&#xff0c;关于二叉搜索树可以看下面这个篇博客&#xff1a;C - 搜索二叉树_chihiro1122的博客-CSDN博客 而 set 是 key 模型&#xff0c;他是直接按照 key 值大小来有规律的在 二叉搜索树当…

pytorch环境配置

pytorch安装与基础 pytorch相关配置一&#xff1a;安装cuda1:找到nvidia control panel2:打开控制面板&#xff0c;找到系统信息中的&#xff0c;组件即可查看到cuda版本&#xff0c;这里我的cuda版本为12.0.1503&#xff1a;下载对应版本的 cuda toolkit4:安装流程5.验证是否安…

163邮箱开通发件功能

点击设置 查看详情 开启这个功能&#xff0c;如下 开通IMAP/SMTP服务 开通POP3/SMTP服务完成了 设置邮箱完成。

解决Agora声网音视频在后台没有声音的问题

前言:本文会介绍 Android 与 iOS 两个平台的处理方式 一、Android高版本在应用退到后台时,系统为了省电会限制应用的后台活动,因此我们需要开启一个前台服务,在前台服务中发送常驻任务栏通知,以此来保证App 退到后台时不会被限制活动. 前台服务代码如下: package com.notify…

QCustomPlot绘图类详解(大白话)

本文假定你会使用Qt开发&#xff0c;但未接触过QCustomPlot绘图类或者是刚接触。 如何往Qt中引入QCustomPlot 首先&#xff0c;去官网下载最新版本的源码&#xff0c;注意是QCustomPlot.tar.gz这个文件&#xff0c;里面包含源码和示例。实际上&#xff0c;我们只需要qcustompl…

[学习笔记]CS224W(图机器学习) 2022/2023年冬学习笔记

资料&#xff1a; 课程网址 斯坦福CS224W图机器学习、图神经网络、知识图谱【同济子豪兄】 斯坦福大学CS224W图机器学习公开课-同济子豪兄中文精讲 cs224w&#xff08;图机器学习&#xff09;2021冬季课程学习笔记集合 序言 到图神经网络GCN为止的内容参考了斯坦福CS224W图机…

XUbuntu22.04之查找进程号pidof、pgrep总结(一百九十)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

【zlm】 webrtc源码讲解

目录 前端WEB 服务器收到请求 服务端的处理 播放 拉流 参考文章 前端WEB 服务器收到请求 POST /index/api/webrtc?applive&streamtest&typeplay HTTP/1.1 HttpSession::onRecvHeaderHttpSession::Handle_Req_POSTHttpSession::Handle_Req_POSTif (totalConte…

雅思学习总结

#【中秋征文】程序人生&#xff0c;中秋共享# 雅思小科普&#xff1a; 1. 什么是雅思考试&#xff1f; 雅思考试是由&#xff1a;英国文化协会、澳洲 IDP 教育集团、剑桥 大学考试委员会举办的英语水平测试。全称翻译成中文是&#xff1a; 国际英语语言测试系统。 2…

数据库直连提示 No suitable driver found for jdbc:postgresql

背景&#xff1a;我在代码里使用直连的方式在数据库中创建数据库等&#xff0c;由于需要适配各个数据库服务所以我分别兼容了mysql、postgresql、oracal等。但是在使用过程中会出现错误&#xff1a; No suitable driver found for jdbc:postgresql 但是我再使用mysql的直连方式…

片上网络(1)概述

前言 NoC&#xff1a;On-Chip Networks&#xff0c;片上网络。 由于多核乃至众核时代的到来&#xff0c;用于连接它们的可扩展、低延迟、大带宽的通信结构变得至关重要。 在核心较少时&#xff0c;总线Bus和矩阵/交叉开关Crossbar是主要的互联结构。总线可以提供较低的传输延迟…

删除安装Google Chrome浏览器时捆绑安装的Google 文档、表格、幻灯片、Gmail、Google 云端硬盘、YouTube网址链接(Mac)

删除安装Google Chrome浏览器时捆绑安装的Google 文档、表格、幻灯片、Gmail、Google 云端硬盘、YouTube网址链接(Mac) Mac mini操作系统&#xff0c;安装完 Google Chrome 浏览器以后&#xff0c;单击 启动台 桌面左下角的“显示应用程序”&#xff0c;我们发现捆绑安装了 Goo…