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

【C++设计模式】行为型模式:观察者模式

文章目录

  • 行为型模式:观察者模式

行为型模式:观察者模式

观察者模式定义了一种一对多的依赖关系:它让一个主题(被观察者)对象关联多个观察者对象,并且当主题对象的状态发生变化时,它会主动通知这些观察者对象,使它们能够自动更新自己或执行相应的响应操作。

以一个设备的温度显示系统为例,在这个示例中,温度检测仪是被观察者,当设备温度发生变化时,它会通知所有的显示器更新温度信息。

#include <iostream>
#include <vector>
#include <string>
#include <algorithm> // 观察者接口
class IObserver {
public:virtual void update(float temperature) = 0;virtual ~IObserver() {}
};// 主题接口(Subject)
class ISubject {
public:virtual void registerObserver(IObserver* observer) = 0;virtual void removeObserver(IObserver* observer) = 0;virtual void notifyObservers() = 0;virtual ~ISubject() {}
};// 被观察者类:设备温度检测仪
class DeviceTemperatureMonitor : public ISubject {
private:std::vector<IObserver*> observers;float temperature;public:// 注册观察者void registerObserver(IObserver* observer) override {observers.push_back(observer);}// 移除观察者void removeObserver(IObserver* observer) override {// std::remove将所有与指定值observer相等的元素移动到容器的末尾,并返回指向第一个不需要保留的元素的迭代器observers.erase(std::remove(observers.begin(), observers.end(), observer), observers.end());}// 通知所有观察者void notifyObservers() override {for (IObserver* observer : observers) {observer->update(temperature);}}// 设置温度状态并通知所有观察者void setTemperature(float temp) {temperature = temp;notifyObservers();}
};// 观察者类:手机显示器
class PhoneDisplay : public IObserver {
private:std::string deviceName;public:PhoneDisplay(const std::string& name) : deviceName(name) {}void update(float temperature) override {std::cout << "Phone Display (" << deviceName << ") - Device Temperature: " << temperature << "°C\n";}
};// 观察者类:窗口显示器
class WindowDisplay : public IObserver {
private:std::string location;public:WindowDisplay(const std::string& loc) : location(loc) {}void update(float temperature) override {std::cout << "Window Display at " << location << " - Device Temperature: " << temperature << "°C\n";}
};int main() {// 创建被观察者对象(设备温度检测仪)DeviceTemperatureMonitor tempMonitor;// 创建观察者对象(显示设备)PhoneDisplay phoneDisplay1("iPhone");PhoneDisplay phoneDisplay2("Samsung");WindowDisplay windowDisplay("Office");// 注册观察者tempMonitor.registerObserver(&phoneDisplay1);tempMonitor.registerObserver(&phoneDisplay2);tempMonitor.registerObserver(&windowDisplay);// 模拟温度数据更新std::cout << "Temperature Update 1:\n";tempMonitor.setTemperature(75.0f);std::cout << "\nTemperature Update 2:\n";tempMonitor.setTemperature(80.0f);// 移除一个观察者tempMonitor.removeObserver(&phoneDisplay2);std::cout << "\nTemperature Update 3 (After removing Samsung Phone Display):\n";tempMonitor.setTemperature(85.0f);return 0;
}
Temperature Update 1:
Phone Display (iPhone) - Device Temperature: 75°C
Phone Display (Samsung) - Device Temperature: 75°C
Window Display at Office - Device Temperature: 75°CTemperature Update 2:
Phone Display (iPhone) - Device Temperature: 80°C
Phone Display (Samsung) - Device Temperature: 80°C
Window Display at Office - Device Temperature: 80°CTemperature Update 3 (After removing Samsung Phone Display):
Phone Display (iPhone) - Device Temperature: 85°C
Window Display at Office - Device Temperature: 85°C

相关文章:

【C++设计模式】行为型模式:观察者模式

文章目录 行为型模式&#xff1a;观察者模式 行为型模式&#xff1a;观察者模式 观察者模式定义了一种一对多的依赖关系&#xff1a;它让一个主题&#xff08;被观察者&#xff09;对象关联多个观察者对象&#xff0c;并且当主题对象的状态发生变化时&#xff0c;它会主动通知…...

本篇5K,立志最细,FreeRtos中的信号量Semaphore教程详解!!!

前言&#xff1a;本篇教程&#xff0c;参考韦东山&#xff0c;开发文档&#xff0c;连接放在最后 目录 Semaphore基本概念 二值信号量&#xff08;Binary Semaphore&#xff09; 计数信号量&#xff08;Couting Semaphore&#xff09; 互斥信号量&#xff08;Mutex&…...

【Postman】接口测试工具使用

干就完啦 Postman发送get请求案例1&#xff1a; Postman发送post请求案例2 Postman发送其他请求Postman测试实战 学习目标&#xff1a;能够使用Postman发送get/post/put/delete请求并获取响应结果 Postman发送get请求 首先postman是一款接口调试工具&#xff0c;支持win&…...

springboot 整合 rabbitMQ(1)

目录 一、MQ概述 二、MQ的优势和劣势 三、常见的MQ产品 RabbitMQ使用步骤 第一步&#xff1a;确保rabbitmq启动并且可以访问15672 第二步&#xff1a;导入依赖 第三步&#xff1a;配置 auto自动确认 manual手工确认&#xff08;推荐使用&#xff01;可以防止消息丢失&a…...

Appium Device Farm安装教程

环境要求&#xff1a;Appium version ≥ 2.4.X 安装appium npm install -g appium2.11.3 如果安装提示如下问题 npm error code EEXIST npm error syscall rename npm error path /Users/wan/.npm/_cacache/tmp/d5787519 npm error dest /Users/wan/.npm/_cacache/content-…...

异常、基类

异常 人生和世界总是充满着意外&#xff0c;争议、冲突和战争似乎是人类必然经历的过程。程序执行也有不满的时候。 不同编程语言的异常 Ada/Modula-3是早期引入异常处理的语言。 C语言没有标准意义的异常&#xff0c;使用goto或setjmp模拟错误或异常发生时的处理流程。 C/Java…...

VScode 自定义代码配色方案

vscode是一款高度自定义配置的编辑器, 我们来看看如何使用它自定义配色吧 首先自定义代码配色是什么呢? 看看我的代码界面 简而言之, 就是给你的代码的不同语义(类名, 函数名, 关键字, 变量)等设置不同的颜色, 使得代码的可读性变强. 其实很多主题已经给出了定制好的配色方案…...

MuMu模拟器12 KitsumeMask安装教程

这里是引用"> 在MuMu模拟器上安装KitsumeMask的时候遇到安装失败的情况。 一、下载APK安装包 如果你没有apk安装包可以通过下面的百度网盘进行下载 通过网盘分享的文件:KitsumeMask 链接: https://pan.baidu.com/s/1yeq3I6BsUD7J6uI-bnk-Vw?pwd=7n3v 提取码: 7n3v 二…...

Perforce静态分析工具2024.2新增功能:Helix QAC全新CI/CD集成支持、Klocwork分析引擎改进和安全增强

Perforce Helix QAC和Klocwork的最新版本对静态分析工具进行了重大改进&#xff0c;通过尽早修复错误、降低开发成本和加快发布速度&#xff0c;使开发团队实现左移。 本文中&#xff0c;我们将概述2024.2版本的新特性和新功能。 CI/CD和左移以实现持续合规性 现代软件开发实…...

太阳能电池特性及其应用

中南民族大学-通信工程2024-大学物理下实验 目录 代码实现结果显示 &#x1f6e0;工具使用 MarsCode&#xff08;插件&#xff0c;集成在PyCharm&#xff09;&#xff1b; python编程&#xff08;豆包AI智能体&#xff09; &#x1f4bb;编程改进 此处是用「Matplotlib」来作图…...

日语学习零基础生活日语口语柯桥外语学校|股票用日语怎么说?

在日语中&#xff0c;“股票”可以说&#xff1a; • 株&#xff08;かぶ&#xff09; 这是最常用的表达方式&#xff0c;直接表示“股票”。 例如&#xff1a; 株を買う - 买股票 株を売る - 卖股票 • 株式&#xff08;かぶしき&#xff09; 这个词也是“股票”的意…...

第2关:寻找一个序列中的第K小的元素(即第k小元问题)

[TOC]寻找一个序列中的第K小的元素&#xff08;即第k小元问题&#xff09; 对于给定的含有n(n<100)元素的无序序列&#xff0c;求这个序列中第k&#xff08;1≤k≤n&#xff09;小的元素。 任务描述 本关任务&#xff1a;编写一个能计算数组中的第k小的元素的小程序。 相关…...

docker 搭建 vue3 + vite

vue3发布了,今天就分享一下我使用docker 搭建 vue3 vite 开发环境。至于为什么使用docker搭建&#xff0c;因为多版本可以快速切换&#xff0c;和本地环境避免冲突。好了话不多说我们开始吧。 1. 准备资料 Docker Desktop wsl2 ubuntu 下载地址 : https://www.docker.…...

【网易云音乐】--源代码分享

最近写了一个网易云音乐的音乐实现部分&#xff0c;是通过JavaScript和jQuery实现的&#xff0c;具体效果大家可以参照下面的视频 源代码分享 - git地址: 网易云音乐源代码 下面将着重讲解一下音乐实现部分 视频有点模糊&#xff0c;不好意思&#xff0c;在b站上添加视频的时候…...

股市大涨下的会展业创新者

近期&#xff0c;股市涨势强劲有力&#xff0c;各大指数普遍上扬&#xff0c;市场活力空前。与此同时&#xff0c;伴随全球经济逐步复苏及会展行业不断发展&#xff0c;上市展览公司机遇与挑战并存。国内外市场需求持续增长拓展了广阔发展空间&#xff0c;但同时行业竞争愈发激…...

工具篇-完整的 Git 项目管理工具教程(在命令框中使用 Git、在 IDEA 中使用 Git)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 Git 概述 2.0 Git 的安装和配置 3.0 获取本地仓库 3.1 基础操作指令 3.2 分支 4.0 Git 远程仓库 4.1 创建远程仓库 4.2 配置 SSH 公钥 4.3 操作远程仓库 5.0 使用…...

关于Amazon Linux 2023的版本及包管理器

在亚马逊上创建EC2实例时&#xff0c;会看到有一个Amazon Linux镜像。 那这个镜像与其他Linux有什么关系和区别呢&#xff1f; 网站是介绍&#xff1a;Amazon Linux 2023 是基于 Linux 的现代化通用操作系统&#xff0c;提供 5 年的长期支持。它针对 AWS 进行了优化&#xff0…...

Java面向对象编程--高级

目录 一、static关键字 1.1 静态变量 1.2 静态内存解析 1.3 static的应用与练习 二、单例设计模式 2.1 单例模式 2.2 如何实现单例模式 三、代码块 3.1 详解 3.2 练习&#xff0c;测试 四、final关键字 五、抽象类与抽象方法 5.1 abstract 5.2 练习 六、接口 6.…...

Vert.x,Web - 静态资源/模板

静态资源 Vert.x-Web带有开箱即用的处理器(StaticHandler)&#xff0c;用于处理静态Web资源(.html, .css, .js, …)&#xff0c; 因此可以非常轻松地编写静态Web服务器。 默认静态文件目录为类路径下的webroot目录&#xff0c;对于maven的项目&#xff0c;按规范放在src/main/…...

OpenAI今天Open了一下:开源多智能体框架Swarm

来源 | 机器之心 毫无疑问&#xff0c;多智能体肯定是 OpenAI 未来重要的研究方向之一&#xff0c;前些天 OpenAI 著名研究科学家 Noam Brown还在 X 上为 OpenAI 正在组建的一个新的多智能体研究团队招募机器学习工程师。 就在几个小时前&#xff0c;这个或许还没有组建完成的新…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

企业如何增强终端安全?

在数字化转型加速的今天&#xff0c;企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机&#xff0c;到工厂里的物联网设备、智能传感器&#xff0c;这些终端构成了企业与外部世界连接的 “神经末梢”。然而&#xff0c;随着远程办公的常态化和设备接入的爆炸式…...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧

上周三&#xff0c;HubSpot宣布已构建与ChatGPT的深度集成&#xff0c;这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋&#xff0c;但同时也存在一些关于数据安全的担忧。 许多网络声音声称&#xff0c;这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...

小木的算法日记-多叉树的递归/层序遍历

&#x1f332; 从二叉树到森林&#xff1a;一文彻底搞懂多叉树遍历的艺术 &#x1f680; 引言 你好&#xff0c;未来的算法大神&#xff01; 在数据结构的世界里&#xff0c;“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的&#xff0c;它…...

【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道

文/法律实务观察组 在债务重组领域&#xff0c;专业机构的核心价值不仅在于减轻债务数字&#xff0c;更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明&#xff0c;合法债务优化需同步实现三重平衡&#xff1a; 法律刚性&#xff08;债…...

高防服务器价格高原因分析

高防服务器的价格较高&#xff0c;主要是由于其特殊的防御机制、硬件配置、运营维护等多方面的综合成本。以下从技术、资源和服务三个维度详细解析高防服务器昂贵的原因&#xff1a; 一、硬件与技术投入 大带宽需求 DDoS攻击通过占用大量带宽资源瘫痪目标服务器&#xff0c;因此…...

32单片机——基本定时器

STM32F103有众多的定时器&#xff0c;其中包括2个基本定时器&#xff08;TIM6和TIM7&#xff09;、4个通用定时器&#xff08;TIM2~TIM5&#xff09;、2个高级控制定时器&#xff08;TIM1和TIM8&#xff09;&#xff0c;这些定时器彼此完全独立&#xff0c;不共享任何资源 1、定…...

2.2.2 ASPICE的需求分析

ASPICE的需求分析是汽车软件开发过程中至关重要的一环&#xff0c;它涉及到对需求进行详细分析、验证和确认&#xff0c;以确保软件产品能够满足客户和用户的需求。在ASPICE中&#xff0c;需求分析的关键步骤包括&#xff1a; 需求细化&#xff1a;将从需求收集阶段获得的高层需…...