// 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
输出: