cpp: Observer Pattern

2023-11-19

// Gold.h : 此文件包含 "Gold" 类。Observer Pattern 观察者模式 C++ 14
// Jewelry Observer Pattern 观察者模式
// 2023年5月10日 涂聚文 Geovin Du Visual Studio 2022 edit. 



#pragma once
#ifndef GOLD_H 
#define GOLD_H 



#include <iostream>
#include <sstream>
#include <vector>
#include <list>



using namespace std;




namespace DuJewelryObserverPattern
{

	extern class Gold; //类前向声明
	extern list<Gold*>  gPlayerList; //在文件头增加#include <list> 全局变量声明

	/// <summary>
	/// 黄金
	/// </summary>
	class Gold
	{

	public:
		//list<Gold*>  gPlayerList;
		/// <summary>
		/// 构造函数
		/// </summary>
		/// <param name="tmpID"></param>
		/// <param name="tmpName"></param>
		Gold(int tmpID, string tmpName) :mIPlayerID(tmpID), mSPlayerName(tmpName)
		{
			mIFamilyID = -1; //-1表示没加入任何协会
		}
		/// <summary>
		/// 析构函数
		/// </summary>
		virtual ~Gold() {} //

	public:
		//virtual void SetFamilyID(int tmpID);
		/// <summary>
		/// 加入协会时设置ID
		/// </summary>
		/// <param name="tmpID"></param>
		void SetFamilyID(int tmpID)  //
		{
			mIFamilyID = tmpID;
		}
		

	public:
		//void SayWords(string tmpContent);
		/// <summary>
		/// 协会会员说了某句话
		/// </summary>
		/// <param name="tmpContent"></param>
			void SayWords(string tmpContent) //
			{
				if (mIFamilyID != -1)
				{
					//该协会会员属于某个协会,应该把聊天内容信息传送给该协会的其他协会会员
					for (auto iter = gPlayerList.begin(); iter != gPlayerList.end(); ++iter)
					{
						if (mIFamilyID == (*iter)->mIFamilyID)
						{
							if (mIPlayerID != (*iter)->mIPlayerID)//自己不收
							{

								//同一个协会的其他协会会员也应该收到聊天信息
								NotifyWords((*iter), tmpContent);
							}
							 //自己也收信息
							//NotifyWords((*iter), tmpContent);
						}
					}
					//只是显示一个
					//if (this->mIFamilyID == mIFamilyID)
					//{
					//	NotifyWords(this, tmpContent);

					//}
					
				}
			}
		
		/// <summary>
		/// 
		/// </summary>
		/// <param name="tmpContent"></param>
		



	private:
		//void NotifyWords(Gold* otherPlayer, string tmpContent);
		/// <summary>
		/// 其他协会会员收到了当前协会会员的聊天信息
		/// </summary>
		/// <param name="otherPlayer"></param>
		/// <param name="tmpContent"></param>
		void NotifyWords(Gold* otherPlayer, string tmpContent) 
		{
			//显示信息
			cout << "协会会员:" << otherPlayer->mSPlayerName << " 收到了会员:" << mSPlayerName << " 发送的聊天信息:" << tmpContent << endl;
		}
		


	private:

		/// <summary>
		/// 协会会员D,全局唯一
		/// </summary>
		int mIPlayerID;       

		/// <summary>
		/// 协会会员名字
		/// </summary>
		string mSPlayerName;  
		/// <summary>
		/// 商会ID
		/// </summary>
		int mIFamilyID;       





	};
}
#endif

// GoldCorporation.h : 此文件包含 "GoldCorporation" 类。  Observer Pattern C++ 14
// Jewelry Observer Pattern 观察者模式
// 2023年5月10日 涂聚文 Geovin Du Visual Studio 2022 edit. 



#pragma once
#ifndef GOLDCOMMERCE_H 
#define GOLDCOMMERCE_H 



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

using namespace std;




namespace DuJewelryObserverPattern
{


	/// <summary>
	/// 黄金商贸商会
	/// </summary>
	class GoldCommerce:public Gold
	{

	private:


	public:

		/// <summary>
		/// 构造函数
		/// </summary>
		/// <param name="tmpID"></param>
		/// <param name="tmpName"></param>		
		GoldCommerce(int tmpID, string tmpName) :Gold(tmpID, tmpName) {
			cout << "商贸商会" << endl;
		} 

	};

}

#endif

// GoldCorporation.h : 此文件包含 "GoldCorporation" 类。  Observer Pattern C++ 14
// Jewelry Observer Pattern 观察者模式
// 2023年5月10日 涂聚文 Geovin Du Visual Studio 2022 edit. 




#pragma once
#ifndef GOLDCORPORATION_H 
#define GOLDCORPORATION_H 



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

using namespace std;




namespace DuJewelryObserverPattern
{


	/// <summary>
	/// 黄金公司
	/// </summary>
	class GoldCorporation :public Gold
	{

	private:


	public:

		/// <summary>
		/// 构造函数
		/// </summary>
		/// <param name="tmpID"></param>
		/// <param name="tmpName"></param>
		GoldCorporation(int tmpID, string tmpName) :Gold(tmpID, tmpName) 
		{
			cout << "黄金公司" << endl;
		} 

	};
}

#endif

// GoldShop.h : 此文件包含 "GoldShop" 类。   Observer Pattern C++ 14
// Jewelry Observer Pattern 观察者模式
// 2023年5月10日 涂聚文 Geovin Du Visual Studio 2022 edit. 


#pragma once
#ifndef GOLDSHOP_H 
#define GOLDSHOP_H 



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

using namespace std;




namespace DuJewelryObserverPattern
{

	/// <summary>
	/// 黄金店铺
	/// </summary>
	class GoldShop :public Gold
	{
	private:



	public:

		/// <summary>
		/// 构造函数
		/// </summary>
		/// <param name="tmpID"></param>
		/// <param name="tmpName"></param>
		GoldShop(int tmpID, string tmpName) :Gold(tmpID, tmpName) {
			cout << "店铺" << endl;
		}

	};

}

#endif

// GeovinDu.cpp : 此文件包含 "GeovinDu" 类。   Observer Pattern C++ 14
// Jewelry Observer Pattern 观察者模式
// 2023年5月10日 涂聚文 Geovin Du Visual Studio 2022 edit. 


#pragma once
#ifndef GEOVINDU_H 
#define GEOVINDU_H 



#include <iostream>
#include <list>
#include "Gold.h"
#include "GoldCommerce.h"
#include "GoldCorporation.h"
#include "GoldShop.h"

using namespace std;



namespace DuJewelryObserverPattern
{

	//extern CMyClass Myclass;


	/// <summary>
	/// 
	/// </summary>
	class GeovinDu
	{

	private:

	public:

		void displaySimple();




	};
}
#endif
// GeovinDu.cpp : 此文件包含 "GeovinDu" 类。   Observer Pattern C++ 14
// Jewelry Observer Pattern 观察者模式
// 2023年5月10日 涂聚文 Geovin Du Visual Studio 2022 edit. 

#include "GeovinDu.h"

using namespace std;




namespace DuJewelryObserverPattern
{


	list<Gold*>  gPlayerList;  //继续引用全局变量

	/// <summary>
	/// 
	/// </summary>
	void GeovinDu::displaySimple()
	{
		
		/**/
	   //创建协会会员
		Gold* pplayerobj1 = new GoldCorporation(10, "张三"); //实际操作中很多数据取自数据库
		pplayerobj1->SetFamilyID(100);    //假设该协会会员所在的商会的商会ID是100
		DuJewelryObserverPattern::gPlayerList.push_back(pplayerobj1); //加入到全局协会会员列表中
		pplayerobj1->SayWords("hi,how are you.");
		Gold* pplayerobj2 = new GoldCorporation(20, "李四");//
		pplayerobj2->SetFamilyID(100);
		DuJewelryObserverPattern::gPlayerList.push_back(pplayerobj2);
		pplayerobj1->SayWords("hi,how are you.");
		Gold* pplayerobj3 = new GoldCommerce(30, "王五");//
		pplayerobj3->SetFamilyID(100);
		DuJewelryObserverPattern::gPlayerList.push_back(pplayerobj3);
		pplayerobj1->SayWords("hi,how are you.");
		Gold* pplayerobj4 = new GoldShop(50, "赵六");//
		pplayerobj4->SetFamilyID(101);  //赵六和前面三人属于两个不同的商会
		DuJewelryObserverPattern::gPlayerList.push_back(pplayerobj4);


		//for (auto it : gPlayerList)
		//{
		//
		//	it->SayWords("涂聚文,你好");
		//}
		//某协会家聊天,同协会人都应该收到该信息
		pplayerobj1->SayWords("全族人立即到沼泽地集结,准备进攻!");

		//释放资源
		delete pplayerobj1;
		delete pplayerobj2;
		delete pplayerobj3;
		delete pplayerobj4;
	



	}

}

调用:

// ConsoleDuObserverPattern.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
// Observer Pattern 观察者模式
//  ConsoleDuObserverPattern.cpp : 此文件包含 "ConsoleDuObserverPattern" 类。 Observer Pattern C++ 14 
// 2023年5月10日 涂聚文 Geovin Du Visual Studio 2022 edit. 文章来源《C++新经典设计模式》 王健伟编著 清华大学出版社 
//
#define _UNICODE


#include <iostream>
#include <list>
#include <map>
#include "GeovinDu.h"
#include "Gold.h"

#ifdef _DEBUG   //只在Debug(调试)模式下
#ifndef DEBUG_NEW
#define DEBUG_NEW new(_NORMAL_BLOCK,__FILE__,__LINE__) //重新定义new运算符
#define new DEBUG_NEW
#endif
#endif

//#include <boost/type_index.hpp>
using namespace std;
//#pragma warning(disable : 4996) 
using namespace DuJewelryObserverPattern;





    int main()
    {
        _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);//程序退出时检测内存泄漏并显示到“输出”窗口
        std::cout << "Hello World!!Programa Olá Mundo!涂聚文 Geovin Du\n";
        GeovinDu geovin;
        geovin.displaySimple();

        system("pause");

        return 0;

    }

    // 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
    // 调试程序: F5 或调试 >“开始调试”菜单

    // 入门使用技巧: 
    //   1. 使用解决方案资源管理器窗口添加/管理文件
    //   2. 使用团队资源管理器窗口连接到源代码管理
    //   3. 使用输出窗口查看生成输出和其他消息
    //   4. 使用错误列表窗口查看错误
    //   5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
    //   6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件


#define UNICODE

输出:

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

cpp: Observer Pattern 的相关文章

  • 将复选框添加到 UniformGrid

    我正在尝试将复选框动态添加到 wpf 中的统一网格中 但看起来网格没有为它们分配足够的空间 所以它们都有点互相重叠 这就是我将它们添加到后面的代码中的方法 foreach string folder in subfolders PathCh
  • 检查两个数是否是彼此的排列?

    给定两个数字 a b 使得 1 例如 123 是 312 的有效排列 我也不想对数字中的数字进行排序 如果您指的是数字的字符 例如 1927 和 9721 则 至少 有几种方法 如果允许排序 一种方法是简单地sprintf将它们放入两个缓冲
  • 如何使 Windows 窗体的关闭按钮不关闭窗体但使其不可见?

    该表单有一个 NotifyIcon 对象 当用户单击 关闭 按钮时 我希望表单不关闭而是变得不可见 然后 如果用户想再次查看该表单 可以双击系统托盘中的图标 如果用户想关闭表单 可以右键单击该图标并选择 关闭 有人可以告诉我如何使关闭按钮不
  • 访问私人成员[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 通过将类的私有成员转换为 void 指针 然后转换为结构来访问类的私有成员是否合适 我认为我无权修改包含我需要访问的数据成员的类 如果不道德 我
  • C# 和 Javascript SHA256 哈希的代码示例

    我有一个在服务器端运行的 C 算法 它对 Base64 编码的字符串进行哈希处理 byte salt Convert FromBase64String serverSalt Step 1 SHA256Managed sha256 new S
  • 获取按下的按钮的返回值

    我有一个在特定事件中弹出的表单 它从数组中提取按钮并将标签值设置为特定值 因此 如果您要按下或单击此按钮 该函数应返回标签值 我怎样才能做到这一点 我如何知道点击了哪个按钮 此时代码返回 DialogResult 但我想从函数返回 Tag
  • 将数组向左或向右旋转一定数量的位置,复杂度为 o(n)

    我想编写一个程序 根据用户的输入 正 gt 负 include
  • pthread_cond_timedwait() 和 pthread_cond_broadcast() 解释

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

    我目前在使用 Newtonsoft Json 时遇到一些问题 我想要的很简单 将要序列化的对象与所有属性和子属性进行比较以确保相等 我现在尝试创建自己的 EqualityComparer 但它仅与父对象的属性进行比较 另外 我尝试编写自己的
  • 为什么#pragma optimize("", off)

    我正在审查一个 C MFC 项目 在某些文件的开头有这样一行 pragma optimize off 我知道这会关闭所有以下功能的优化 但这样做的动机通常是什么 我专门使用它来在一组特定代码中获得更好的调试信息 并在优化的情况下编译应用程序
  • 获取没有非标准端口的原始 url (C#)

    第一个问题 环境 MVC C AppHarbor Problem 我正在调用 openid 提供商 并根据域生成绝对回调 url 在我的本地机器上 如果我点击的话 效果很好http localhost 12345 login Request
  • 如何将图像和 POST 数据上传到 Azure 移动服务 ApiController 终结点?

    我正在尝试上传图片and POST表单数据 尽管理想情况下我希望它是json 到我的端点Azure 移动服务应用 我有ApiController method HttpPost Route api upload databaseId sea
  • Qt moc 在头文件中实现?

    是否可以告诉 Qt MOC 我想声明该类并在单个文件中实现它 而不是将它们拆分为 h 和 cpp 文件 如果要在 cpp 文件中声明并实现 QObject 子类 则必须手动包含 moc 文件 例如 文件main cpp struct Sub
  • 指针减法混乱

    当我们从另一个指针中减去一个指针时 差值不等于它们相距多少字节 而是等于它们相距多少个整数 如果指向整数 为什么这样 这个想法是你指向内存块 06 07 08 09 10 11 mem 18 24 17 53 7 14 data 如果你有i
  • C# 中的递归自定义配置

    我正在尝试创建一个遵循以下递归结构的自定义配置部分
  • 实体框架 4 DB 优先依赖注入?

    我更喜欢创建自己的数据库 设置索引 唯一约束等 使用 edmx 实体框架设计器 从数据库生成域模型是轻而易举的事 现在我有兴趣使用依赖注入来设置一些存储库 我查看了 StackOverflow 上的一些文章和帖子 似乎重点关注代码优先方法
  • 控制到达非 void 函数末尾 -wreturn-type

    这是查找四个数字中的最大值的代码 include
  • 在 Dynamics CRM 插件中访问电子邮件发件人地址

    我正在编写一个 Dynamics CRM 2011 插件 该插件挂钩到电子邮件实体的更新后事件 阶段 40 pipeline http msdn microsoft com en us library gg327941 aspx 并且在此阶
  • ASP.NET MVC 6 (ASP.NET 5) 中的 Application_PreSendRequestHeaders 和 Application_BeginRequest

    如何在 ASP NET 5 MVC6 中使用这些方法 在 MVC5 中 我在 Global asax 中使用了它 现在呢 也许是入门班 protected void Application PreSendRequestHeaders obj
  • C 中的异或运算符

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

随机推荐

  • visio画图常见问题解答

    使用visio画图有很多优点 与office相关产品完全兼容 可随时修改 操作简单等等 这里不再多说 我们在使用这一工具的时候常常会遇到一些小问题 但是这些小问题看似小 有的时候却会让我们折腾上半天 废话少说 现在把常见的几个问题的解决方案
  • java数组求和函数_Excel表格求和,难道你只会用SUM函数?(下)

    Excel求和函数 绝大部分人只会用SUM函数 今天再来分享4个求和函数 年前集齐8个求和函数年后开运 1 使用SUMXMY2函数返回两个数组中对应值差的平方和 SUMXMY2函数用于返回两数组中对应数值之差的平方和 函数语法 SUMXMY
  • 如何给keepalived配置vip(虚拟ip)

    首先为了测试机器 准备两台服务器 host1 172 28 23 73 host2 172 28 23 96 虚拟ip 172 28 23 100 第一步 在线安装keepalived中间件 sudo yum install y keepa
  • CMake Error: Cannot determine link language for target “test“.

    问题来源 project kinodyntest LANGUAGES CXX 先指定语言c add executable 后面传入的文件是 c 文件导致cmake报错 c 文件为 cpp
  • 论文笔记:STMARL: A Spatio-Temporal Multi-AgentReinforcement Learning Approach for Cooperative Traffic

    0 abstract 智能交通灯控制系统的开发对于智能交通管理至关重要 虽然已经做出了一些努力以孤立的形式来优化单个红绿灯的使用 但相关研究在很大程度上忽略了多路口红绿灯的使用受到空间影响的事实 以及历史交通状态的时间依赖性 为此 在本文中
  • 用microPython写一个ESP32的OLED的程序

    好的 我可以给你提供一些有关使用 MicroPython 在 ESP32 上编写 OLED 显示屏程序的指导 首先 你需要在 ESP32 上安装 MicroPython 固件 你可以使用 esptool 工具将 MicroPython 固件
  • iscsi多路径配置方式

    学习一个服务的过程 1 此服务器的概述 名字 功能 特点 端口号 2 安装 3 配置文件的位置 4 服务启动关闭脚本 查看端口 5 此服务的使用方法 6 修改配置文件 实战举例 7 排错 从下到上 从内到外 内容 实战 配置IP SAN多路
  • Linux升级命令yum update

    Linux升级命令有两个分别是yum upgrade和yum update 这个两个命令是有区别的 代码如下 yum y update 升级所有包同时也升级软件和系统内核 代码如下 yum y upgrade 只升级所有包 不升级软件和系统
  • Memcach基础使用

    memcache 基础课程 使用场景 memcache 服务器端的安装 推荐使用memcached memcached是memchache的升级版本 sudo su apt get install memcached usr bin mem
  • 02-12306验证码预处理(分割、转存dat、解析dat文件)

    import cv2 as cv import numpy as np import os import binascii temp path r F python StockAnalyzer test test avi img path
  • 决策分类树算法之ID3,C4.5算法系列

    一 引言 在最开始的时候 我本来准备学习的是C4 5算法 后来发现C4 5算法的核心还是ID3算法 所以又辗转回到学习ID3算法了 因为C4 5是他的一个改进 至于是什么改进 在后面的描述中我会提到 二 ID3算法 ID3算法是一种分类决策
  • 从TCP协议的原理来谈谈rst复位攻击

    在谈RST攻击前 必须先了解TCP 如何通过三次握手建立TCP连接 四次握手怎样把全双工的连接关闭掉 滑动窗口是怎么传输数据的 TCP的flag标志位里RST在哪些情况下出现 下面我会画一些尽量简化的图来表达清楚上述几点 之后再了解下RST
  • svn软件常用命令

    下载代码 命令 svn co 代码路径 查看工程中被修改的文件的内容 命令 svn diff 查看工程中文件的状态 命令 svn status 备注 状态是 M 就是被修改过 M是modify的缩写 回退被修改的文件 命令 svn reve
  • 2020中科院sci分区查询_查询SCI分区有几种方法

    查询SCI分区有几种方法 SCI分区目前有两种方法和标准 一个是中科院分区 一个是JCR分区 SCI期刊的分区有着重要意义 SCI期刊的影响因子都是浮动变化的 如果以一个影响因子的固定值来区分期刊是不合理的 不同领域内的期刊影响因子也没有可
  • Java单链表反转 详细过程

    https blog csdn net guyuealian article details 51119499 一 单链表的结点结构 data域 存储数据元素信息的域称为数据域 next域 存储直接后继位置的域称为指针域 它是存放结点的直接
  • Microsoft Dynamics CRM 安装注意事项(请朋友们补充)

    最近安装Microsoft Dynamics CRM 遇到的了很多烦人的小问题 特此记录下需要注意事项 仅供参考 服务器 Windows Server 2012 R2 Datacenter 安装及顺序 IIS gt SQLServer gt
  • 高质量、高并发的实时通信架构设计与探索

    中国互联网络信息中心 CNNIC 近日发布的第 47 次 中国互联网络发展状况统计报告 显示 截至 2020 年 12 月 我国网民规模达 9 89 亿 随着社会信息化水平持续提升及电子设备加速普及 手机网民规模持续增长 基本实现对全体网民
  • D - Robots Easy (脑残题)

    D Robots Easyhttps vjudge csgrandeur cn problem Gym 102267D 题意 对于给出的 12 12 的图 有 l 组查询 每组给出一个坐标 要求从这个坐标开始行走 遇到黑色或在边界不能走 直
  • AGPBI: {“kind“:“error“,“text“:“Program type already present: android.support.v4.os.ResultReceiver$1“

    使用环境 遇见 解决方法 第一步 object下的build gradle文件中build gradle版本号修改 第二步 object下的Gradle版本号修改 具体对应版本 没有一个固定的对应关系 取决于创建项目时创建者当时的AS环境
  • cpp: Observer Pattern

    Gold h 此文件包含 Gold 类 Observer Pattern 观察者模式 C 14 Jewelry Observer Pattern 观察者模式 2023年5月10日 涂聚文 Geovin Du Visual Studio 20