1. 抽象一个同事类和中介者类
1.1. 同事类
//Colleague(抽象同事类)
class AbstractChatRoom;
class Member
{
public:
explicit Member(const std::string &name)
{
m_pChatRoom = nullptr;
m_imageSize = 0;
this->m_sName = name;
}
std::string getName()
{
return this->m_sName;
}
void setName(const std::string &memberName)
{
this->m_sName = memberName;
}
AbstractChatRoom* getChatRoom()
{
return m_pChatRoom;
}
void bindChatRoom(AbstractChatRoom* chatRoom)
{
this->m_pChatRoom = chatRoom;
}
//发送
virtual void sendText(const std::string &to, const std::string &message) = 0;
virtual void sendImage(const std::string &to, const std::string &image) = 0;
//接收
virtual void receiveText(const std::string& from, const std::string &message)
{
std::cout << from << "发送文本给" << this->m_sName << ",内容为:" << message << std::endl;
}
virtual void receiveImage(const std::string& from, const std::string &image)
{
std::cout << from << "发送图片给" << this->m_sName << ",内容为:" << image << std::endl;
}
int getImageSize()
{
return m_imageSize;
}
protected:
AbstractChatRoom *m_pChatRoom;
std::string m_sName;
int m_imageSize;
};
1.2. 中介者类
//Mediator(抽象者)
class AbstractChatRoom
{
public:
virtual ~AbstractChatRoom() = default;
virtual void registerMember(Member *member) = 0;
virtual void sendText(const std::string &from, const std::string &to,const std::string &message) = 0;
virtual void sendImage(const std::string &from,const std::string &to,const std::string &image) = 0;
protected:
AbstractChatRoom() = default;
};
2. 具体化一个一个同事类和中介者类
2.1. 具体同事类
//ConcreteColleague(具体同事类)
class OrdinaryMember : public Member
{
public:
explicit OrdinaryMember(const std::string &name) : Member(name)
{
m_imageSize = 0;
std::cout << "OrdinaryMember 构造函数,name = " << name << std::endl;
}
~OrdinaryMember()
{
std::cout << "OrdinaryMember 析构函数" << std::endl;
}
void sendText(const std::string &to, const std::string &message) override
{
std::cout << "普通会员发送消息:" << std::endl;
m_pChatRoom->sendText(m_sName, to, message);
}
void sendImage(const std::string &to, const std::string &image) override
{
std::cout << "普通会员不能发送图片!" << std::endl;
}
private:
};
class SilverMember : public Member
{
public:
explicit SilverMember(const std::string &name) : Member(name)
{
m_imageSize = 8;
std::cout << "SilverMember 构造函数,name = " << name << std::endl;
}
~SilverMember()
{
std::cout << "SilverMember 析构函数" << std::endl;
}
void sendText(const std::string &to, const std::string &message) override
{
std::cout << "白银会员发送消息:" << std::endl;
m_pChatRoom->sendText(m_sName, to, message);
}
void sendImage(const std::string &to, const std::string &image) override
{
std::cout << "白银会员发送图片!" << std::endl;
m_pChatRoom->sendImage(m_sName, to, image);
}
private:
};
2.2. 具体中介者类
//ConreteMediator(具体中介者)
class ChatRoom : public AbstractChatRoom
{
public:
ChatRoom()
{
std::cout << "ChatRoom 构造函数" << std::endl;
}
~ChatRoom() override
{
std::cout << "ChatRoom 析构函数" << std::endl;
}
void registerMember(Member* member) override
{
//if (!m_MemberMap.count(member->getName()))
if (0 == m_MemberMap.count(member->getName()))
{
m_MemberMap.insert(make_pair(member->getName(),member));
member->bindChatRoom(this);
}
}
void sendText(const std::string &from,const std::string &to,const std::string &message) override
{
Member *memberTo = m_MemberMap[to];
if (nullptr != memberTo)
{
memberTo->receiveText(from, message);
}
}
void sendImage(const std::string &from,const std::string &to,const std::string &image) override
{
Member *memberFrom = m_MemberMap[from];
if (nullptr == memberFrom)
{
return;
}
int imageSize = memberFrom->getImageSize();
if (imageSize < image.size())
{
std::cout << memberFrom->getName() << "无法发送大小超过 " << imageSize << " 的图片,请提升会员等级" << std::endl;
}
else
{
Member *memberTo = m_MemberMap[to];
if (nullptr != memberTo)
{
memberTo->receiveImage(from, image);
}
}
}
private:
std::map<std::string, Member*> m_MemberMap;
};
3. 主函数
#include <string>
#include <map>
#include <iostream>
using namespace std;
int main()
{
//创建聊天室
ChatRoom happyChat;
//创建会员
OrdinaryMember ordinaryMember("张三");
SilverMember silverMember("李四");
//注册
happyChat.registerMember(&ordinaryMember);
happyChat.registerMember(&silverMember);
//发送消息
ordinaryMember.sendText("李四","李四,你好!");
silverMember.sendText("张三","张三,你好!");
//发送图片
ordinaryMember.sendImage("李四", "合照.png");
silverMember.sendImage("张三", "花.png");
silverMember.sendImage("张三", "奥利给.png");
getchar();
return 0;
}