C++_design_model_observer

/*
观察者模式是一种常用的设计模式,用于在对象之间建立一种一对多的依赖关系,当被观察的对象发生变化时,
所有依赖于它的对象都能够得到通知并自动更新。下面是一个使用C++实现观察者模式的例子:
*/#include <iostream>
#include <vector>// 定义观察者接口
class Observer {
public:virtual void update(int value) = 0;
};// 定义被观察者接口
class Subject {
public:virtual void attach(Observer* observer) = 0;virtual void detach(Observer* observer) = 0;virtual void notify() = 0;
};// 具体的被观察者实现
class ConcreteSubject : public Subject {
private:int m_value;std::vector<Observer*> m_observers;public:void attach(Observer* observer) override {m_observers.push_back(observer);}void detach(Observer* observer) override {for (auto it = m_observers.begin(); it != m_observers.end(); ++it) {if (*it == observer) {m_observers.erase(it);break;}}}void notify() override {for (auto observer : m_observers) {observer->update(m_value);}}void setValue(int value) {m_value = value;notify();}
};// 具体的观察者实现
class ConcreteObserver : public Observer {
public:void update(int value) override {std::cout << "Value changed to " << value << std::endl;}
};int main() {ConcreteSubject subject;ConcreteObserver observer1;ConcreteObserver observer2;// 将观察者添加到被观察者的观察列表中subject.attach(&observer1);subject.attach(&observer2);// 修改被观察者的值,观察者将会收到通知subject.setValue(3);// 将观察者从被观察者的观察列表中移除subject.detach(&observer2);// 再次修改被观察者的值,只有observer1会收到通知subject.setValue(5);return 0;
}/*
在这个例子中,Subject是被观察者的接口,ConcreteSubject是具体的被观察者实现,Observer是观察者的接口,ConcreteObserver是具体的观察者实现。
ConcreteSubject中维护了一个观察列表,可以动态地添加和移除观察者。当被观察者的值发生改变时,它会调用notify方法来通知所有的观察者。
在main函数中,我们创建了一个ConcreteSubject对象和两个ConcreteObserver对象,将它们添加到观察列表中,并修改被观察者的值来测试观察者模式的实现。
*/

1. 运行结果

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

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

相关文章

Redis篇----第六篇

系列文章目录 文章目录 系列文章目录前言一、Redis 的持久化机制是什么?各自的优缺点?二、Redis 常见性能问题和解决方案:三、redis 过期键的删除策略?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章…

已经打包好了的vue dist文件夹,如何用electron打包成exe桌面应用

先在项目根目录下&#xff08;非dist根目录&#xff09;安装electron electron-packager npm install electron再在项目根目录下&#xff08;非dist根目录&#xff09;安装electron-packager npm install electron-packager 然后在dist文件夹下创建main.js文件,内容为 cons…

如何查看springboot依赖的JDK版本

通过maven构建Java项目或者使用源代码进行Java编译时&#xff0c;常常遇到JDK版本和Springboot版本不匹配的问题&#xff0c;导致编译失败&#xff0c;比如出现如下错误&#xff1a; org/springframework/beans/factory/InitializingBean.class [ERROR] 类文件具有错误的…

Unix I/O 模型及Java I/O 模型详解

在Unix Socket的输入操作中&#xff0c;可以将其分为以下几个阶段&#xff1a; 等待数据就绪(内核空间)&#xff1a; 在这个阶段&#xff0c;应用程序通过调用阻塞式的读取函数&#xff08;如recv&#xff09;或非阻塞式的读取函数&#xff08;如recv、recvfrom&#xff09;等待…

可扩展性和性能:数字化成功的支柱

在动态的数字技术世界中,用户的期望和对数字系统的需求不断增加,可扩展性和性能已成为孪生要素。在本文中,我们将全面探讨软件和系统设计的两个基本方面:水平扩展、垂直扩展和性能优化。 简介:关键当务之急 考虑一个场景:您正在管理一个电子商务平台,限时抢购导致网站…

入门级10寸加固行业平板—EM-I10J

亿道信息以其坚固耐用的智能终端设备而闻名&#xff0c;近日发布了一款理想入门级 10 英寸加固平板电脑—I10J。 EM-I10J​​ 这是一款 10 英寸的平板电脑&#xff0c;主要运行 Windows 10操作系统&#xff0c;带有硬化塑料外壳&#xff0c;具有 IP65 防水防尘功能和 MIL-STD 8…

线性dp之石子合并

设有 N堆石子排成一排&#xff0c;其编号为 1,2,3,…,N。 每堆石子有一定的质量&#xff0c;可以用一个整数来描述&#xff0c;现在要将这 N 堆石子合并成为一堆。 每次只能合并相邻的两堆&#xff0c;合并的代价为这两堆石子的质量之和&#xff0c;合并后与这两堆石子相邻的…

注册及搭建小程序开发环境

一、注册小程序账号 打开微信公众平台&#xff0c;通过邮箱注册小程序账号&#xff08;每个邮箱账号&#xff0c;只能注册一个小程序&#xff09;。 注册完成后&#xff0c;登录邮箱&#xff0c;打开激活地址&#xff0c;按照邮件提示&#xff0c;填写信息&#xff0c;激活账号…

MongoDB语言命令

文章目录 MongoDB shellMongoDB数据类型数据插入数据查询数据删除数据更新MongoDb数组更新和时间序列MongoDB特殊索引mongoDB权限设置 MongoDB shell 1、MongoDB用文档的形式存储数据&#xff0c;BSON的数据格式。 2、MongoDB与传统数据库相比&#xff0c;集合相当于表&#x…

springboot 任务执行和调度详细介绍

Spring Boot支持任务执行和调度&#xff0c;这可以通过Spring框架的TaskExecutor和TaskScheduler接口来实现。这些功能允许你异步执行任务和定时执行任务&#xff0c;这在处理批量作业、定时任务和异步服务时非常有用。 任务执行 Spring的TaskExecutor接口提供…

redis的hash数据结构底层简记

hash&#xff1a;k和v都是string的hash表。 HSET&#xff08;设置集合数据&#xff0c;4.0之前只能设置1个&#xff0c;之后可以设置多个&#xff09;&#xff0c;HSETNX(若k不存在则设置对应v)&#xff0c;HDEL&#xff08;删除指定kv&#xff0c;可以一次删除多个&#xff09…

Eclipse - 查看工程或者文件的磁盘路径

Eclipse - 查看工程或者文件的磁盘路径 1. Help -> Eclipse Marketplace -> Find: Explorer -> Eclipse Explorer 4.1.0 -> Install2. right-click -> Open in ExplorerReferences 1. Help -> Eclipse Marketplace -> Find: Explorer -> Eclipse Explo…

Java 中使用Collections类来反转集合的顺序

如何使用Collections类来反转集合的顺序 在Java中&#xff0c;Collections类提供了一些有用的静态方法&#xff0c;用于操作集合。然而&#xff0c;Collections类并没有直接提供反转集合顺序的方法。但是&#xff0c;你可以使用List接口中的Collections.reverse(List<?>…

门店数字化之旅:如何跨越那些难以逾越的鸿沟?

在数字化浪潮席卷全球的背景下&#xff0c;连锁门店运营正面临着一场深刻的变革。这场变革不仅关乎技术的升级&#xff0c;更涉及到商业模式、管理理念以及消费者体验的根本性转变。然而&#xff0c;在这场转型之路上&#xff0c;许多门店却常常遭遇各种痛点&#xff0c;让数字…

2023年总结与2024展望

今天是春节后上班第一天&#xff0c;你懂的&#xff0c;今天基本上是摸鱼状态&#xff0c;早上把我们负责的项目的ppt介绍完善了一下&#xff0c;然后写了一篇技术文章&#xff0c;《分布式系统一致性与共识算法》。接着就看了我近几年写的的年度总结&#xff0c;我一般不会在元…

一个服务器实现本机服务互联网化

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 一个服务器实现本机服务互联网化 前言痛点关于中微子代理实战演练搭建服务端搭建客户端服务端配置代理实现 前言 在数字世界的网络战场上&#xff0c;中微子代理就像是一支潜伏在黑暗中的数字特工队&…

自动化上位机开发C#100例:雷赛运动控制卡EtherCAT总线卡C#封装类

自动化上位机开发C#100例:雷赛运动控制卡EtherCAT总线卡C#封装类 文章目录 LTDMC.dll下载LTDMC.cs LTDMC.dll C#调用封装下载ICard.cs 运动控制卡接口Card.cs 运动控制卡抽象类CardLTDMC.cs 雷赛运动控制卡EtherCAT总线卡实现类CardList.cs 总线卡列表封装 LTDMC.dll下载 最新…

100天精通Python(实用脚本篇)——第116天:基于selenium实现反反爬策略之添加cookie登录网站

文章目录 专栏导读1. cookie是什么?2. cookie登录网站的优点?3. 浏览器怎么查看cookie?4. 代码获取cookie5. 添加cookie登录网站专栏导读 🔥🔥本文已收录于《100天精通Python从入门到就业》:本专栏专门针对零基础和需要进阶提升的同学所准备的一套完整教学,从0到100的…

【笔记------STM32】MX_RTC_Init()初始化RTC时RTC_ISR_INITF位超时失败的解决方法

RTC和flash有点像&#xff0c;有些功能需要解锁才能配置&#xff0c;虽然cubeMX生成的RTC部分的解锁配置正确&#xff0c;但却没有配置好前提条件&#xff1a;关闭PWR模块的备份域写保护使能&#xff0c;有点奇怪&#xff0c;手动关掉就好了 现象&#xff1a;进入RTC_EnterInit…

java数据结构与算法刷题-----LeetCode239. 滑动窗口最大值

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 1. 法一&#xff1a;指针法 解题思路 我们以每一个窗口来看&#xff0c;找…