c++实现观察者模式

news2025/1/17 14:06:58

前言

我觉得这是最有意思的模式,其中一个动,另外的自动跟着动。发布-订阅,我觉得很巧妙。

代码

头文件

#pragma once
#include<vector>
#include<string>
#include<iostream>

// 抽象观察者
class Aobserver
{
public:
	virtual void update(std::string& updated_state) = 0;
};


// 抽象通知者
class Asubject
{
protected:
	std::vector<Aobserver*> _pObservers;

	bool whetherRegist(Aobserver* p_observer)
	{
		for (auto it : _pObservers) {
			if (it == p_observer) return true;
		}
		return false;
	}

public:
	virtual void registObserver(Aobserver* p_observer) = 0;
	virtual void detachObserver(Aobserver* p_observer) = 0;
	virtual void notify(const std::string& teacher_name) = 0;

};


// 具体通知者
class Csubject1 : public Asubject
{
private:
	std::string _subjectName;

public:
	Csubject1(const std::string& subject_name) :_subjectName(subject_name) {}

	// 注册观察者
	void registObserver(Aobserver* p_observer) override
	{
		if (p_observer!=nullptr && whetherRegist(p_observer) == false) {
			_pObservers.push_back(p_observer);
		}
	}

	void detachObserver(Aobserver* p_observer) override
	{
		if (p_observer != nullptr)
		{
			for (auto it : _pObservers) {
				if (it == p_observer) {
					_pObservers.erase(
						std::remove(_pObservers.begin(),_pObservers.end(),it),
						_pObservers.end());
				}
			}
		}
	}

	void notify(const std::string& teacher_name) override
	{
		std::string notify_state = _subjectName + " say: "+ teacher_name +" is coming!";
		for (auto it : _pObservers) {
			it->update(notify_state);
		}
	}
};

// 具体观察者
class Hablee : public Aobserver
{
private:
	void cancleReading(std::string& updated_state)
	{
		std::cout << updated_state;
		std::cout << " you should stop reading" << std::endl;
	}

public:
	void update(std::string& updated_state) override
	{
		this->cancleReading(updated_state);
	}

};

class Yuki : public Aobserver
{
private:
	void canclePlayingGuitar(std::string& updated_state)
	{
		std::cout << updated_state;
		std::cout << " you should stop plaing guitar" << std::endl;
	}

public:
	void update(std::string& updated_state) override
	{
		this->canclePlayingGuitar(updated_state);
	}
};

main.cpp

#include<iostream>
#include"Aobserver.h"


int main()
{
	Csubject1 wzq("wangZhaoQi"); // 通知者
	
	Hablee lhb;	
	wzq.registObserver(&lhb);

	Yuki wwy;
	wzq.registObserver(&wwy);

	wzq.notify("lyj");
	wzq.notify("xiaoZhang");

	wzq.detachObserver(&lhb);
	wzq.notify("lyj");
	
	return 0;
}

在这里插入图片描述

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

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

相关文章

第二证券:涨停板被打开说明什么?

涨停板&#xff0c;是股票价格动摇的限制性规则。简略来说&#xff0c;涨停板就是当某股票价格较前一个生意日的收盘价上涨了必定份额的时分&#xff0c;商场生意将受到限制&#xff0c;股票价格不能继续上涨&#xff0c;即当日该股票的涨幅上限。而当涨停板被翻开&#xff0c;…

用于 GaN-HEMT 功率器件仿真的 TCAD 方法论

目录 标题&#xff1a;TCAD Methodology for Simulation of GaN-HEMT Power Devices来源&#xff1a;Proceedings of the 26th International Symposium on Power Semiconductor Devices & ICs(14年 ISPSD)GaN-HEMT仿真面临的挑战文章研究了什么文章的创新点文章的研究方法…

做视频目标分割、人体姿态跟踪、语义part分割的同学看过来,李飞飞最新作品

SiamMAE&#xff1a;一种从视频中进行表示学习的孪生掩码自编码器&#xff0c;在视频目标分割、人体姿态跟踪、语义part分割上性能表现出色单位&#xff1a;斯坦福大学(李飞飞、吴佳俊等人), 普林斯顿大学(邓嘉) 在图像或场景之间建立对应关系是计算机视觉中的一项重大挑战&am…

恢复电脑删除的文件?这4个简单方法别错过!

“我经常都会把文件保存在电脑上&#xff0c;但是总是不可避免的会误删一些比较重要的文件。有什么比较容易操作的文件恢复方法可以推荐吗&#xff1f;非常感谢&#xff01;” 在日常使用电脑时&#xff0c;用户可能都不可避免的会出现误删文件的情况。这可能包括重要的文档、照…

治理效率提升77%!揭秘基于DataLeap实时健康分的最佳实践

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 背景 某企业实时数仓团队通过数据收集、整合、计算和存储构建实时数据仓库&#xff0c;为企业提供快速、准确、可靠的实时数据分析和决策支持。目前该实时数仓团队…

5.2023-11-02发表的最新论文复现:SSA-VMD与小波分解结合的GNSS坐标时序降噪方法

2023-11-02发表的最新论文复现代码&#xff1a; 注&#xff1a;针对文献去噪流程进行了细节部分修改 1.将多尺度排列熵大于0.5的分量全部删除&#xff0c;发现其效果更佳 2.文中小波分解方法具体的方法不确定&#xff0c;本代码是应用小波阈值去噪于改进VMD相结合进行去噪 代…

工业废水再利用在哪些地方

工业废水再利用主要应用于以下几个方面&#xff1a; 工业生产&#xff1a;回收废水中含有的各种有价值的资源&#xff0c;如水、盐、油、悬浮物等&#xff0c;用于生产过程。预处理和深度处理&#xff1a;为满足工业生产过程对水质的要求&#xff0c;对废水进行预处理和深度处…

当风格遇上浴缸:浴室装饰的秘诀

浴室不再仅仅是个洗漱的地方&#xff0c;如今它们是室内设计的一部分&#xff0c;有时甚至是焦点。浴室的装饰风格可以塑造整个房间的氛围&#xff0c;而浴缸通常是浴室内最引人注目的元素之一。在这里&#xff0c;我们将简单探讨不同室内设计风格与浴缸如何融合&#xff0c;让…

vue3-ace-editor前端 json格式化显示 json编辑器使用

前端 json格式化显示 json编辑器使用vue3-ace-editor 1.安装 项目目录下打开终端 运行 npm install vue3-ace-editor2.使用 <template><div classcontent><el-select v-model"aceConfig.theme" class"m-2" placeholder"Select"…

提升物流效率和可见性:RFID技术在物流线上的创新应用

随着科技的进步&#xff0c;物联网和大数据的应用越来越广泛。RFID&#xff08;无线射频识别技术&#xff09;作为物联网的重要组成部分&#xff0c;已经广泛应用于物流行业中。RFID技术通过无线电信号识别特定目标&#xff0c;无需人工干预&#xff0c;大大提高了物流线的效率…

基于SSM的个人通讯录设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

微信小程序overflow-x超出部分样式不渲染

把display:flex改成display:inline-flex&#xff0c; 将对象作为内联块级弹性伸缩盒显示&#xff0c; 类似与是子元素将父元素撑开&#xff0c;样式就显示出来了

Python+pandas将Excel文件xls批量转换xlsx(代码全注释)

文章目录 专栏导读背景安装的库代码部分(全注释)视频演示总结&#x1f44d; 该系列文章专栏&#xff1a;[Python办公自动化专栏]PS: xlsx转xls文章在这&#xff1a;【点我直达】 专栏导读 &#x1f338; 欢迎来到Python办公自动化专栏—Python处理办公问题&#xff0c;解放您的…

接口自动化测试requests

1.什么是requests&#xff1f; requests是一个Python第三方库&#xff0c;处理URL资源特别方便 2.安装requests pip3 install requests 如果遇到Permission denied安装失败&#xff0c;请加上sudo重试 3.使用requests 3.1get请求方法 3.1.1基本的get请求 import reques…

HTTPS的加密方式超详细解读

在了解https的加密方式之前&#xff0c;我们需要先行了解两个特别经典的传统加密方式&#xff1a; 1、对称加密 1.1、定义 需要对加密和解密使用相同密钥的加密算法。所谓对称&#xff0c;就是采用这种加密方法的双方使用方式用同样的密钥进行加密和解密。密钥是控制加密及解…

MojoUserAgent库

Mojo::UserAgent 是 Perl 编程语言中的一个库&#xff0c;用于创建和管理 HTTP 请求。它提供了一个简单而强大的接口&#xff0c;用于发送 HTTP 请求并处理响应。 以下是一个使用 Mojo::UserAgent 的简单示例&#xff1a; use Mojo::UserAgent;创建一个 Mojo::UserAgent 对象…

小红书优质达人标准是什么,达人投放攻略!

众所周知kol、koc投放&#xff0c;相较于信息流和竞价广子而言&#xff0c;在投放结果上&#xff0c;存在更多的浮动因素。而想要把控kol、koc的投放结果&#xff0c;就需要在匹配优质达人方面多下功夫。今天为大家分享下小红书优质达人标准是什么&#xff0c;达人投放攻略&…

包含3的数字-第10届蓝桥杯省赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第2讲。 包含3的数字&#…

微信小程序:实现多个按钮提交表单

效果 核心步骤 通过data-type给不同按钮进行设置&#xff0c;便于很好的区分不同按钮执行不同功能 data-type"" 完整代码 wxml <form action"" bindsubmit"formSubmit"><button style"margin-bottom:5%" data-type"pa…

技术共建,飞桨与OpenVINO™ 共创开放AI生态

在智能新时代&#xff0c;百度和英特尔作为行业引领者&#xff0c;一直专注于构建强大的产品组合和开放的软件生态系统。为此&#xff0c;百度飞桨打造功能丰富、开源开放的产业级深度学习平台&#xff0c;英特尔推出OpenVINO™工具套件&#xff0c;并致力于借助双方技术来增强…