【C/C++】观察者模式

创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
🔥c++系列专栏:C/C++零基础到精通 🔥

给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ

在这里插入图片描述

c语言内容💖:

专栏:c语言之路重点知识整合

【c语言】全部知识点总结


目录

  • 一、观察者模式的实现
  • 二、示例

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。

当主题对象状态发生变化时,它的所有依赖者(观察者)都会自动收到通知并更新
image.png

一、观察者模式的实现

  • 1. 定义观察者接口:包含 update 更新方法,定义为虚函数
  • 2. 创建具体观察者:实现观察者接口,定义接收到通知时的更新动作
  • 3. 定义主题接口:添加、删除和通知观察者
  • 4. 创建具体主题:实现主题接口,实现观察者列表,更新数据时通知观察者

二、示例

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
#include <vector>
#include <time.h>
using namespace std;//接口
class Observer 
{
public:virtual ~Observer() {}virtual void update(const string& data) = 0; // 接收主题发送的数据  
};//主题对象
class Subject 
{
public:virtual ~Subject() {}virtual void attach(Observer* observer) = 0; // 添加观察者  virtual void detach(Observer* observer) = 0; // 移除观察者  virtual void notify() = 0; // 通知所有观察者  
};class ConcreteSubject : public Subject
{
private:vector<Observer*> observers;string data;public:// 添加观察者  void attach(Observer* observer) override {observers.push_back(observer);}// 移除观察者  void detach(Observer* observer) override {auto it = find(observers.begin(), observers.end(), observer);if (it != observers.end()){observers.erase(it);}}// 通知观察者 void notify() override {for (auto observer : observers) {//调用更新函数observer->update(data);}}//数据更新void setData(const string& newData) {data = newData;notify(); // 当数据改变时,通知所有观察者  }
};//主题对象更新
class ConcreteObserver : public Observer 
{
private:string name;public:ConcreteObserver(const string& name) : name(name) {}void update(const string& data) override {cout << name << " TianXiStudio time: " << data << endl;}
};int main() 
{//创建主题对象ConcreteSubject subject;//创建两个观察者ConcreteObserver observer1("Observer 1");ConcreteObserver observer2("Observer 2");//两个观察者依赖主题对象subject.attach(&observer1);subject.attach(&observer2);//数据更新time_t now;time(&now);subject.setData(ctime(&now));return 0;
}

image.png


在这里插入图片描述

大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●)

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

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

相关文章

牛客周赛44 F小红的基环树删边

原题链接&#xff1a;F-小红的基环树删边 题目大意&#xff1a;给一个基环树&#xff0c;一个n个点&#xff0c;n条边。若是删除第i边&#xff0c;从1到n的最短距离是多少&#xff1f; 思路&#xff1a;因为是基环树&#xff0c;那么从1到n最多就只有二条路径&#xff0c;那么…

香橙派 AIpro开发体验:使用YOLOV8对USB摄像头画面进行目标检测

香橙派 AIpro开发体验&#xff1a;使用YOLOV8对USB摄像头画面进行目标检测 前言一、香橙派AIpro硬件准备二、连接香橙派AIpro1. 通过网线连接路由器和香橙派AIpro2. 通过wifi连接香橙派AIpro3. 使用vscode 通过ssh连接香橙派AIpro 三、USB摄像头测试1. 配置ipynb远程开发环境1.…

【程序填空题】日期比较(运算符重载)

题目描述 定义一个日期类CDate&#xff0c;包含属性&#xff1a;年、月、日&#xff0c;都是整数。 构造函数含单个参数&#xff0c;参数是八位整数&#xff0c;默认值为0&#xff0c;实现整数转为日期类型&#xff0c;例如参数为20170612&#xff0c;转为year2017, month6, …

Python实现批量删除Word文档内容中的“指定”内容(5)

前言 本文是该专栏的第5篇,后面会持续分享Python办公自动化干货知识,记得关注。 如果说,有这样的一个需求——有一批废弃词,需要你通过python,对目标word文档中包含这些废弃词的目标内容,进行批量删除。接到这样的需求,第一时间你会想到需要怎么去解决呢? 而本文,笔…

Python实现批量修改Word文档内容的字体大小(6)

前言 本文是该专栏的第6篇,后面会持续分享Python办公自动化干货知识,记得关注。 在本专栏上一篇文章《Python实现批量删除Word文档内容中的“指定”内容(5)》中,笔者有详细介绍通过python删除word文档内容中的“指定内容”。 而本文,在上一篇文章的思路基础上,再实现一…

Mybatis多表查询,报错:Column ‘id‘ in field list is ambiguous

错误原因&#xff1a; Mybatis 多表查询时&#xff0c;多个表有相同名字的字段&#xff0c;比如 id&#xff0c;名字重复&#xff0c;没有指定对应的表名。 有两个地方需要注意&#xff1a;(1)将其中一个重复字段的 Mybatis的 column 修改为其他的名字。(2)字段加上对应的表名…

Java 8 Lambda 表达式:新手入门指南

随着Java 8的发布&#xff0c;Lambda 表达式成为了Java编程中一个不可或缺的特性。Lambda 表达式允许我们以更简洁、更直观的方式表示函数式接口的实例。本文将引导新手如何开始使用Java 8的Lambda表达式。 1. 什么是Lambda表达式&#xff1f; Lambda 表达式是一个匿名函数&…

AI重塑了我的工作流

阅读内容 Inhai: Agentic Workflow&#xff1a;AI 重塑了我的工作流 4 种主要的 Agentic Workflow 设计模式 Reflection&#xff08;反思&#xff09;&#xff1a;让 Agent 审视和修正自己生成的输出。 举例&#xff1a;如果有两个 Agent&#xff1a;一个负责 Coding&#…

损失函数篇 | YOLOv8更换损失函数之Inner-IoU | 通过辅助边界框计算IoU损失

前言:Hello大家好,我是小哥谈。损失函数是机器学习中用来衡量模型预测值与真实值之间差异的函数。在训练模型时,我们希望通过不断调整模型参数,使得损失函数的值最小化,从而使得模型的预测值更加接近真实值。为弥补现有IoU损失函数在不同的检测任务中的泛化能力较弱且收敛…

unity制作app(9)--拍照 相册 上传照片

1.传输照片&#xff08;任何较大的数据&#xff09;都需要扩展服务器的内存空间。 2.还需要base64编码 2.1客户端发送位置的编码 2.2服务器接收部分的代码

数据链路层 + NAT技术

数据链路层&#xff1a;负责设备之间的数据帧的传送和识别。 一、以太网 以太网的帧格式 如何分离报头和有效数据&#xff1f; 报头是固定长度的 如何将数据交给上层协议&#xff1f; 通过类型&#xff0c;如果是0800&#xff0c;则交给IP协议&#xff0c;如果是0806&#xf…

Vue中使用Axios

安装Axios&#xff1a; 首先确保已经安装了Axios。你可以使用npm或者yarn进行安装&#xff0c;如下所示&#xff1a; pm install axios 导入Axios&#xff1a; 在需要发送HTTP请求的组件中&#xff0c;使用import语句导入Axios库。 import axios from axios; 发送HTTP请求&…

前端HTML5从入门到精通面试题及参考答案(2万字长文)

目录 描述HTML5与HTML4的主要区别是什么? HTML5为什么不基于SGML? HTML5的DOCTYPE声明是什么?

力扣爆刷第145天之图论五连刷(dfs和bfs)

力扣爆刷第145天之图论五连刷&#xff08;dfs和bfs&#xff09; 文章目录 力扣爆刷第145天之图论五连刷&#xff08;dfs和bfs&#xff09;总结一、797. 所有可能的路径二、200. 岛屿数量三、695. 岛屿的最大面积四、1020. 飞地的数量五、130. 被围绕的区域 总结 dfs是一条路走…

Debug - nacos配置 第二弹

好的 又是一个蠢蠢的 nacos 配置上出现的问题 在使用 nacos 进行 配置共享时 报错 Description: Failed to configure a DataSource: ‘url’ attribute is not specified and no embedded datasource could be configured. Reason: Failed to determine a suitable driver c…

5.30边缘智能开发工具链全解析 | 2024高通边缘智能创新应用大赛公开课

2024高通边缘智能创新应用大赛系列公开课迎来精彩续篇&#xff01;本期课程将由阿加犀智能科技技术总监秦朝&#xff0c;为大家带来一场关于边缘智能方案与创新应用的深度分享。 作为本次大赛的联合主办方&#xff0c;阿加犀为比赛设备提供强大的软件支持。 各位参赛者将上手…

谷歌忙于手动删除自己搜索引擎中奇怪的人工智能答案

该公司确认正在“迅速采取行动”消除人工智能工具的一些奇怪反应。 社交媒体上充斥着谷歌新的人工智能概述产品的例子&#xff0c;这些产品说了一些奇怪的话&#xff0c;从告诉用户在披萨上涂胶水到建议他们吃石头。混乱的推出意味着&#xff0c;随着各种表情包的发布&#xf…

Android Gradle文件 一次通关

前言 Android的Gradle是每个项目一定包含的文件&#xff0c;用来定义构建配置的脚本文件&#xff0c;通常包括两个主要文件&#xff1a;build.gradle&#xff08;项目级别&#xff09;和build.gradle&#xff08;模块级别&#xff09;。 项目级别的 build.gradle 文件 项目级…

【Typescript】通过变量的值即可获取变量的类型【typeof 变量】

注意&#xff1a;只要变量的类型准确,则typeof获取变量的类型就不会错 enum Test {a "a0",b "b0" }// 这里的a是一个变量的值 let a: Test.a "a0" as Test.a// 这里的typeof a是一个类型【Test.a】 let x: typeof a Test.a

C++系列-定位new表达式(placement-new)

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 我们先来强调一个很关键的问题&#xff0c;那就是在new和delete中的一一对应的问题&#xff0c; 我们先来看一段代码&#xff1a; #include<iostream> using namespace …