c++之观察者模式

2023-11-04

一,观察者模式

随着交通信号灯的变化,汽车的行为也随之而变化,一盏信号灯可以指挥多辆汽车。
观察者模式是用于建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,
其他对象将相应作出反应,在观察者模式中,发生改变的对象称为观察目标,
而被通知的对象称为观察者,一个观察目标可以对应多个观察者(红绿灯对应多辆汽车)

二,代码实现

#include <iostream>
#include <vector>
#include <queue>
#include<list>
#include <Windows.h>
using namespace std;

class AbstractHero
{
public:
	virtual void Update() = 0;	
};

class HeroA :public AbstractHero
{
public:
	HeroA()
	{
		Sleep(2000);

		cout<<"英雄A正在打boss.."<<endl;
	}
	virtual void Update()
	{
		cout<<"英雄A停止打击,待机状态.."<<endl;
	}
};

class HeroB :public AbstractHero
{
public:
	HeroB()
	{
		Sleep(2000);

		cout<<"英雄B正在打boss.."<<endl;
	}
	virtual void Update()
	{
		cout<<"英雄B停止打击,待机状态停止打击,待机状态.."<<endl;
	}	
};

class HeroC :public AbstractHero
{
public:
	HeroC()
	{
		Sleep(2000);

		cout<<"英雄C正在打boss.."<<endl;
	}	
	virtual void Update()
	{
		cout<<"英雄C停止打击,待机状态.."<<endl;
	}

};

class HeroD :public AbstractHero
{
public:
	HeroD()
	{
		Sleep(2000);

		cout<<"英雄D正在打boss.."<<endl;
	}

	virtual void Update()
	{
		cout<<"英雄D停止打击,待机状态.."<<endl;
	}

};

//观察目标抽象
class AbstractBoss
{
public:
	//添加观察者
	virtual void addHero(AbstractHero* hero) = 0;
	//删除观察者
	virtual void deleteHero(AbstractHero* hero) = 0;
	//通知所以观察者
	virtual void notify() = 0;	
};

class BOSSA:public AbstractBoss
{
public:
	virtual void addHero(AbstractHero* hero)
	{
		m_pHeroList.push_back(hero);
	}
	virtual void deleteHero(AbstractHero* hero)
	{
		m_pHeroList.remove(hero);
	}	
	virtual void notify()
	{
		for(auto it = m_pHeroList.begin(); it != m_pHeroList.end();it++)
		{
			Sleep(2000);
			cout<<"***"<<endl;
			(*it)->Update();
		}
	}

public:
	list<AbstractHero*> m_pHeroList;

};

int main()
{
	AbstractHero* heroA = new HeroA;
	AbstractHero* heroB = new HeroB;
	AbstractHero* heroC = new HeroC;
	AbstractHero* heroD = new HeroD;

	AbstractBoss* bossA = new BOSSA;
	bossA->addHero(heroA);
	bossA->addHero(heroB);
	bossA->addHero(heroC);
	bossA->addHero(heroD);

	cout<<"heroC阵亡..."<<endl;
	bossA->deleteHero(heroC);

	cout<<"boss死了通知其它英雄停止攻击,抢装备.."<<endl;
	bossA->notify();

	system("pause");
	return 0;
}

三,运行截图

运行截图

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++之观察者模式 的相关文章

  • 将复选框添加到 UniformGrid

    我正在尝试将复选框动态添加到 wpf 中的统一网格中 但看起来网格没有为它们分配足够的空间 所以它们都有点互相重叠 这就是我将它们添加到后面的代码中的方法 foreach string folder in subfolders PathCh
  • 是否可以强制 XMLWriter 将元素写入单引号中?

    这是我的代码 var ptFirstName tboxFirstName Text writer WriteAttributeString first ptFirstName 请注意 即使我使用 ptFirstName 也会以双引号结束 p
  • pthread_cond_timedwait() 和 pthread_cond_broadcast() 解释

    因此 我在堆栈溢出和其他资源上进行了大量搜索 但我无法理解有关上述函数的一些内容 具体来说 1 当pthread cond timedwait 因为定时器值用完而返回时 它如何自动重新获取互斥锁 互斥锁可能被锁定在其他地方 例如 在生产者
  • 未解决的包含:“cocos2d.h” - Cocos2dx

    当我在 Eclipse 中导入 cocos2dx android 项目时 我的头文件上收到此警告 Unresolved inclusion cocos2d h 为什么是这样 它实际上困扰着我 该项目可以正确编译并运行 但我希望这种情况消失
  • linux perf:如何解释和查找热点

    我尝试了linux perf https perf wiki kernel org index php Main Page今天很实用 但在解释其结果时遇到了困难 我习惯了 valgrind 的 callgrind 这当然是与基于采样的 pe
  • Newtonsoft JSON PreserveReferences处理自定义等于用法

    我目前在使用 Newtonsoft Json 时遇到一些问题 我想要的很简单 将要序列化的对象与所有属性和子属性进行比较以确保相等 我现在尝试创建自己的 EqualityComparer 但它仅与父对象的属性进行比较 另外 我尝试编写自己的
  • 当 contains() 工作正常时,xpath 函数ends-with() 工作时出现问题

    我正在尝试获取具有以特定 id 结尾的属性的标签 like span 我想获取 id 以 国家 地区 结尾的跨度我尝试以下xpath span ends with id Country 但我得到以下异常 需要命名空间管理器或 XsltCon
  • WPF 中的调度程序和异步等待

    我正在尝试学习 WPF C 中的异步编程 但我陷入了异步编程和使用调度程序的困境 它们是不同的还是在相同的场景中使用 我愿意简短地回答这个问题 以免含糊不清 因为我知道我混淆了 WPF 中的概念和函数 但还不足以在功能上正确使用它 我在这里
  • WPF TabControl,用C#代码更改TabItem的背景颜色

    嗨 我认为这是一个初学者的问题 我搜索了所有相关问题 但所有这些都由 xaml 回答 但是 我需要的是后台代码 我有一个 TabControl 我需要设置其项目的背景颜色 我需要在选择 取消选择和悬停时为项目设置不同的颜色 非常感谢你的帮助
  • Qt moc 在头文件中实现?

    是否可以告诉 Qt MOC 我想声明该类并在单个文件中实现它 而不是将它们拆分为 h 和 cpp 文件 如果要在 cpp 文件中声明并实现 QObject 子类 则必须手动包含 moc 文件 例如 文件main cpp struct Sub
  • 如何返回 json 结果并将 unicode 字符转义为 \u1234

    我正在实现一个返回 json 结果的方法 例如 public JsonResult MethodName Guid key var result ApiHelper GetData key Data is stored in db as v
  • 如何在 VBA 中声明接受 XlfOper (LPXLOPER) 类型参数的函数?

    我在之前的回答里发现了问题 https stackoverflow com q 19325258 159684一种无需注册即可调用 C xll 中定义的函数的方法 我之前使用 XLW 提供的注册基础结构 并且使用 XlfOper 类型在 V
  • 插入记录后如何从SQL Server获取Identity值

    我在数据库中添加一条记录identity价值 我想在插入后获取身份值 我不想通过存储过程来做到这一点 这是我的代码 SQLString INSERT INTO myTable SQLString Cal1 Cal2 Cal3 Cal4 SQ
  • C++ fmt 库,仅使用格式说明符格式化单个参数

    使用 C fmt 库 并给定一个裸格式说明符 有没有办法使用它来格式化单个参数 example std string str magic format 2f 1 23 current method template
  • 控制到达非 void 函数末尾 -wreturn-type

    这是查找四个数字中的最大值的代码 include
  • 如何让Gtk+窗口背景透明?

    我想让 Gtk 窗口的背景透明 以便只有窗口中的小部件可见 我找到了一些教程 http mikehearn wordpress com 2006 03 26 gtk windows with alpha channels https web
  • 如何使用 std::string 将所有出现的一个字符替换为两个字符?

    有没有一种简单的方法来替换所有出现的 in a std string with 转义 a 中的所有斜杠std string 完成此操作的最简单方法可能是boost字符串算法库 http www boost org doc libs 1 46
  • C 中的异或运算符

    在进行按位操作时 我在确定何时使用 XOR 运算符时遇到一些困难 按位与和或非常简单 当您想要屏蔽位时 请使用按位 AND 常见用例是 IP 寻址和子网掩码 当您想要打开位时 请使用包含或 然而 XOR 总是让我明白 我觉得如果在面试中被问
  • 防止索引超出范围错误

    我想编写对某些条件的检查 而不必使用 try catch 并且我想避免出现 Index Out of Range 错误的可能性 if array Element 0 Object Length gt 0 array Element 1 Ob
  • 使用按位运算符相乘

    我想知道如何使用按位运算符将一系列二进制位相乘 但是 我有兴趣这样做来查找二进制值的十进制小数值 这是我正在尝试做的一个例子 假设 1010010 我想使用每个单独的位 以便将其计算为 1 2 1 0 2 2 1 2 3 0 2 4 虽然我

随机推荐

  • 基于SpringBoot+Vue框架前后端分离的在线购物平台的设计与实现

    系统合集跳转 一 系统环境 运行环境 最好是java jdk 1 8 我们在这个平台上运行的 其他版本理论上也可以 IDE环境 Eclipse Myeclipse IDEA或者Spring Tool Suite都可以 tomcat环境 To
  • 量化投资学习-34:缺口是制造恐慌和疯狂情绪的手段!

    缺口是制造恐慌和疯狂情绪的手段 发生在不同的阶段 目的是不一样的 底部向下 加速赶底 一般发生了连续下跌的末端 在最后制造疯狂下跌的恐慌 这是筑底的标志 底部向上 借助缺口 实现快速拉升 快速脱离底部成本区 大阳 底部跳空缺口是中级行情开始
  • ts项目打包报错 error TS6504: xxxxxx is a JavaScript file. Did you mean to enable the ‘allowJs‘ option?

    项目vue3 ts 打包时一个组件如下错误 解决 加上lang
  • 毕业设计-基于机器学习的网络舆情情感倾向分析

    目录 前言 课题背景和意义 实现技术思路 一 论坛文本采集方法研究 二 文本情感分析理论 三 论坛文本预处理 四 文本表示及特征抽取 五 情感倾向分类器 实现效果图样例 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业
  • Java中异常问题(异常抛出后是否继续执行的问题)

    public static void test throws Exception throw new Exception 参数越界 System out println 异常后 编译错误 无法访问的语句 代码2 异常被捕获 日志打印了异常
  • Python Pandas修改列类型

    使用astype如下 df column df column astype type type即int float等类型 示例 import pandas as pd data pd DataFrame 1 2 2 2 data colum
  • vue3 setup 组合式api props父子组件传值详解

    vue3组合式api中 父组件通过在子组件上通过v bind传递给子组件数据 子组件通过defineprops函数在子组件中定义父组件中传入子组件的数据就可以接收这些数据 然后可在template中直接使用 但是想要在setup中使用父组件
  • Python之爬虫 搭建代理ip池

    文章目录 前言 一 User Agent 二 发送请求 三 解析数据 四 构建ip代理池 检测ip是否可用 五 完整代码 总结 前言 在使用爬虫的时候 很多网站都有一定的反爬措施 甚至在爬取大量的数据或者频繁地访问该网站多次时还可能面临ip
  • 前端学习--知识整理

    前端学习 知识整理 一 深 浅拷贝 1 深拷贝和浅拷贝是只针对Object和Array这样的引用数据类型的 2 赋值和浅拷贝的区别 3 浅拷贝的实现方式 1 Object assign 2 Array prototype concat 3
  • Ubuntu系统网络连不上&线缆已拔出&服务启动

    解决问题 Ubuntu系统网络连不上 线缆已拔出 服务启动 关于Ubuntu联网失败 最近遇到过多次 但是总结下面前面的解决方法治标不治本 根本原因在于VMware DHCP Service运行状态的问题 之前的解决方法 更改虚拟网络编辑器
  • 【电子DIY】基于NE555制作的简易电子琴

    基于NE555制作的简易电子琴 青岛科技大学 信息科学技术学院 集成162 Listen C 一 背景简介 自多次利用51单片机 无源蜂鸣器制作电子琴多次以后 突然领悟蜂鸣器产生声波的原理 无非是产生一定频率占空比50 的PWM而已 然后
  • 二叉查找树(BST)

    二叉查找树 BST 二叉查找树 Binary Search Tree 又叫二叉排序树 Binary Sort Tree 它是一种数据结构 支持多种动态集合操作 如 Search Insert Delete Minimum 和 Maximum
  • 华为麦芒B199全焦拍照 比单反还有料

    近期 在2000元内价位上涌现了很多表现出色的智能手机 其中不得不提到华为麦芒B199 该机创造了网络平台一分钟售罄10万部的销售神话 到底这部手机有什么神奇之处呢 这里重点介绍下麦芒B199先进的全焦拍照功能 华为麦芒B199 通常 我们
  • vue filters和directives的this指向

    vue filters和directives的this指向 记录一次奇葩的需求 要求自定义一个指令 点击后能跳转指定路由 directives和filters压根就没法访问this 脑袋都想破了 不废话了 上代码
  • 芯片行业常用英文术语最详细总结(图文快速掌握)

    目录 一 简介 二 厂家分类 三 工艺和阶段 3 1 芯片工艺 3 2 芯片阶段 四 晶圆等级 五 其他英文解析 六 相关岗位及职能 一 简介 本文主要总结了半导体行业在工作中常用的英文含义 通过将内容分类 对生产厂家 工艺和阶段 晶圆等级
  • Java Optional类说明及使用(JDK8)

    Optional类是JDK8提供的类 用于防止出现空指针异常 本篇旨在对该类进行说明及具体使用方式列举 一 序言 Option在使用中主要是为了简化传统Java的if else形式对null情况进行判断 既然为了简化代码编写 就必须要提到J
  • c语言 prototype_keil c语言出现错误C206 missing function-prototype

    include include define uchar unsigned char static unsigned char table 6 0 0 0 0 0 0 Declare functions uchar Busy Check v
  • 什么是解耦表示学习?使用beta-VAE模型探究医疗和金融问题

    作者 Alexandr Honchar 译者 大鱼 编辑 Rachel 琥珀 出品 AI科技大本营 id rgznai100 导语 本文对传统的人工数学建模和机器学习的优缺点进行了介绍和比较 并介绍了一种将二者优点相结合的方法 解耦表示学习
  • 浅析多线程中的各种锁

    高并发的场景下 如果选对了合适的锁 则会大大提高系统的性能 否则性能会降低 所以 知道各种锁的开销 以及应用场景是很有必要的 文章目录 常用的各种锁 互斥锁与自旋锁 互斥锁 自旋锁 读写锁 乐观锁与悲观锁 本文小结 常用的各种锁 多线程访问
  • c++之观察者模式

    一 观察者模式 随着交通信号灯的变化 汽车的行为也随之而变化 一盏信号灯可以指挥多辆汽车 观察者模式是用于建立一种对象与对象之间的依赖关系 一个对象发生改变时将自动通知其他对象 其他对象将相应作出反应 在观察者模式中 发生改变的对象称为观察