[img]https://api5.yunpan.360.cn/intf.php?method=Share.getPublicThumbByNid&qid=108635719&nid=13770720612900357&size=800_600&devtype=web&v=1.0.1&rtick=14676146429780&share_qid=108635719&sign=f3a44f394170f80f34fc15d522261fb2&[/img]
[img]https://api5.yunpan.360.cn/intf.php?method=Share.getPublicThumbByNid&qid=108635719&nid=14676145729453968&size=800_600&devtype=web&v=1.0.1&rtick=14676146458401&share_qid=108635719&sign=ff2f079b295de3662d013ae897afb1e3&[/img]
[img]https://api5.yunpan.360.cn/intf.php?method=Share.getPublicThumbByNid&qid=108635719&nid=14676145739458187&size=800_600&devtype=web&v=1.0.1&rtick=14676146451509&share_qid=108635719&sign=cc1c1e5e61090abf73fb00c58f9db2a2&[/img]
[color=red][b]头文件[/b][/color]
[color=red][b]实现[/b][/color]
[color=red][b]客户端[/b][/color]
运行结果
[img]https://api5.yunpan.360.cn/intf.php?method=Share.getPublicThumbByNid&qid=108635719&nid=14676146009499695&size=800_600&devtype=web&v=1.0.1&rtick=14676146459089&share_qid=108635719&sign=33525efca1b084be76d663c4efe55a37&[/img]
[img]https://api5.yunpan.360.cn/intf.php?method=Share.getPublicThumbByNid&qid=108635719&nid=14676145729453968&size=800_600&devtype=web&v=1.0.1&rtick=14676146458401&share_qid=108635719&sign=ff2f079b295de3662d013ae897afb1e3&[/img]
[img]https://api5.yunpan.360.cn/intf.php?method=Share.getPublicThumbByNid&qid=108635719&nid=14676145739458187&size=800_600&devtype=web&v=1.0.1&rtick=14676146451509&share_qid=108635719&sign=cc1c1e5e61090abf73fb00c58f9db2a2&[/img]
[color=red][b]头文件[/b][/color]
//MediatorPattern.h
#ifndef MEDIATOR_PATTERN_H
#define MEDIATOR_PATTERN_H
#include <Windows.h>
#include <iostream>
using namespace std;
namespace MediatorPattern
{
class Mediator;
class Colleague
{
public:
Colleague(Mediator* pMediator);
virtual void Send(const char* pszMsg) = 0;
virtual void Notify(const char* pszMsg) = 0;
protected:
Mediator* m_pMediator;
};
class ConcreteColleagueA : public Colleague
{
public:
ConcreteColleagueA(Mediator* pMediator);
virtual void Send(const char* pszMsg);
virtual void Notify(const char* pszMsg);
};
class ConcreteColleagueB : public Colleague
{
public:
ConcreteColleagueB(Mediator* pMediator);
virtual void Send(const char* pszMsg);
virtual void Notify(const char* pszMsg);
};
//
class Mediator
{
public:
virtual void Send(const char* pszMsg, Colleague* pColleague) = 0;
};
class ConcreteMediator : public Mediator
{
public:
virtual void Send(const char* pszMsg, Colleague* pColleague);
void SetColleagueA(Colleague* pColleague);
void SetColleagueB(Colleague* pColleague);
private:
// The Mediator knows all the Colleague
ConcreteColleagueA* m_pConcreteColleagueA;
ConcreteColleagueB* m_pConcreteColleagueB;
};
//
void MediatorPattern_Test();
}
#endif
[color=red][b]实现[/b][/color]
#include "MediatorPattern.h"
#include <iostream>
using namespace std;
#define SAFE_DELETE(p) if (p) { delete p; p = NULL; }
namespace MediatorPattern
{
//
Colleague::Colleague(Mediator* pMediator)
: m_pMediator(pMediator)
{
cout << "Colleague::Colleague" << endl;
}
//
ConcreteColleagueA::ConcreteColleagueA(Mediator* pMediator)
: Colleague(pMediator)
{
cout << "ConcreteColleagueA::ConcreteColleagueA" << endl;
}
void ConcreteColleagueA::Send(const char* pszMsg)
{
cout << "ConcreteColleagueA::Send" << endl;
cout << "Send request to Mediator:" << pszMsg << endl;
m_pMediator->Send(pszMsg, this);
}
void ConcreteColleagueA::Notify(const char* pszMsg)
{
cout << "ConcreteColleagueA::Notify " << endl;
cout << "Receive response from Mediator:" << pszMsg << endl;
}
//
ConcreteColleagueB::ConcreteColleagueB(Mediator* pMediator)
: Colleague(pMediator)
{
cout << "ConcreteColleagueA::ConcreteColleagueB" << endl;
}
void ConcreteColleagueB::Send(const char* pszMsg)
{
cout << "ConcreteColleagueB::Send" << endl;
cout << "Send request to Mediator:" << pszMsg << endl;
m_pMediator->Send(pszMsg, this);
}
void ConcreteColleagueB::Notify(const char* pszMsg)
{
cout << "ConcreteColleagueB::Notify " << endl;
cout << "Receive response from Mediator:" << pszMsg << endl;
}
//
void ConcreteMediator::Send(const char* pszMsg, Colleague* pColleague)
{
cout << "ConcreteMediator::Send -> GetMessage:" << pszMsg << endl;
ConcreteColleagueA* pTemp = dynamic_cast<ConcreteColleagueA*>(pColleague);
if (NULL == pTemp)
{
cout<<"The message is from ConcreteColleagueA. Now mediator forward it to ConcreteColleagueB"<<endl;
if (m_pConcreteColleagueB != NULL)
{
pTemp->Notify("[ConcreteColleagueB]ConcreteMediator::Send->Notify");
}
}
else
{
if (m_pConcreteColleagueA != NULL)
{
pTemp->Notify("[ConcreteColleagueA]ConcreteMediator::Send->Notify");
}
}
}
void ConcreteMediator::SetColleagueA(Colleague* pColleague)
{
m_pConcreteColleagueA = dynamic_cast<ConcreteColleagueA*>(pColleague);
}
void ConcreteMediator::SetColleagueB(Colleague* pColleague)
{
m_pConcreteColleagueB = dynamic_cast<ConcreteColleagueB*>(pColleague);
}
//
void MediatorPattern_Test()
{
// Create the mediator
Mediator *pMediator = new ConcreteMediator();
Colleague *pColleague1 = new ConcreteColleagueA(pMediator);
Colleague *pColleague2 = new ConcreteColleagueB(pMediator);
ConcreteMediator *pConcreteMediator = dynamic_cast<ConcreteMediator *>(pMediator);
pConcreteMediator->SetColleagueA(pColleague1);
pConcreteMediator->SetColleagueB(pColleague2);
char message[260] = "Where are you from?";
pColleague1->Send(message);
}
}
[color=red][b]客户端[/b][/color]
#include "MediatorPattern.h"
#include <iostream>
#include <sstream>
#include <string>
#include <list>
using namespace std;
using namespace VisitorPattern;
void main()
{
MediatorPattern_Test();
}
运行结果
[img]https://api5.yunpan.360.cn/intf.php?method=Share.getPublicThumbByNid&qid=108635719&nid=14676146009499695&size=800_600&devtype=web&v=1.0.1&rtick=14676146459089&share_qid=108635719&sign=33525efca1b084be76d663c4efe55a37&[/img]