cpp: Observer Pattern

25 篇文章 0 订阅
文章展示了一个使用C++14实现的观察者模式例子,涉及黄金商贸系统中的会员(如黄金商贸商会、公司、店铺)之间的通信。会员加入商会后,能接收到同商会其他会员的聊天信息。系统通过全局列表维护所有会员,并实现了信息的传递功能。
摘要由CSDN通过智能技术生成
// 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

输出:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值