#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include <ctime>
#include<string>
#include<list>
#include <map>
using namespace std;
class Fighter;
class Notifer
{
public:
virtual void AddTolist(Fighter *player) = 0;
virtual void RemoveFromList(Fighter *player) = 0;
virtual void Notify(Fighter*player, string strText) = 0;
};
class Fighter
{
private:
int m_nFighterID;//玩家ID
int m_nFamilyID;//家族ID
string m_strFighterName;//玩家名字
public:
Fighter(int nFighterID, int nFamilyID, string strFighterName) :m_nFighterID(nFighterID),
m_nFamilyID(nFamilyID), m_strFighterName(strFighterName)
{
}
void SayWords(Notifer *pNotifer, string strText)
{
pNotifer->Notify(this, strText);
}
virtual void NotifyWords(Fighter *fg, string strText)
{
cout << "玩家" << m_strFighterName << "收到" << fg->GetPlayerName().c_str() << "的消息:" << strText.c_str() << endl;
}
int GetFamilyID()
{
return m_nFamilyID;
}
int GetPlayerID()
{
return m_nFighterID;
}
string GetPlayerName()
{
return m_strFighterName;
}
};
class TalkNotifer:public Notifer
{
public:
void AddTolist(Fighter *player)
{
auto it = m_map.find(player->GetFamilyID());
if (it != m_map.end())
{
//找到了,加入玩家族
it->second.push_back(player);
}
else
{
list<Fighter *>m_list;
m_map.insert(make_pair(player->GetFamilyID(), m_list));
m_map[player->GetFamilyID()].push_back(player);
}
}
void RemoveFromList(Fighter *player)
{
}
void Notify(Fighter*player, string strText)
{
auto it = m_map.find(player->GetFamilyID());
if (it != m_map.end())
{
//通知
for (auto node :it->second)
{
node->NotifyWords(player, strText);
}
}
}
private:
map<int, list<Fighter *> > m_map;
};
class Fighter_1 :public Fighter
{
public:
Fighter_1(int nFighterID, int nFamilyID, string strFighterName) :Fighter(nFighterID, nFamilyID, strFighterName+"X")
{
}
};
class Fighter_2 :public Fighter
{
public:
Fighter_2(int nFighterID, int nFamilyID, string strFighterName) :Fighter(nFighterID, nFamilyID, strFighterName+"Pro")
{
}
};
void main()
{
Fighter *pf1 = new Fighter_1(10, 1, "张三");
Fighter *pf2 = new Fighter_2(11, 1, "李四");
Fighter *pf3 = new Fighter_2(12, 2, "王五");
Fighter *pf4 = new Fighter_1(13, 2, "赵六");
Fighter *pf5 = new Fighter_1(14, 2, "李七");
Notifer *pno = new TalkNotifer();
pno->AddTolist(pf1);
pno->AddTolist(pf2);
pno->AddTolist(pf3);
pno->AddTolist(pf4);
pno->AddTolist(pf5);
pf1->SayWords(pno, "大家好,我新来的!");
pf3->SayWords(pno, "大家好,我是老鸟!");
system("pause");
}
结果: