#include<iostream>usingnamespace std;#define SAFE_DELETE(p)if(p){delete p; p = NULL;}classMediator;classColleague{public:Colleague(Mediator*pMediator): m_pMediator(pMediator){}virtualvoidSend(wchar_t*message)=0;protected:Mediator*m_pMediator;};classConcreteColleague1:publicColleague{public:ConcreteColleague1(Mediator*pMediator):Colleague(pMediator){}voidSend(wchar_t*message);voidNotify(wchar_t*message){
wcout<<message<<endl;}};classConcreteColleague2:publicColleague{public:ConcreteColleague2(Mediator*pMediator):Colleague(pMediator){}voidSend(wchar_t*message);voidNotify(wchar_t*message){
cout<<"ConcreteColleague2 is handling the message."<<endl;
wcout<<message<<endl;}};classMediator{public:virtualvoidSent(wchar_t*message,Colleague*pColleague)=0;};classConcreteMediator:publicMediator{public:// The mediator forward the messagevoidSent(wchar_t*message,Colleague*pColleague){ConcreteColleague1*pConcreteColleague1 =dynamic_cast<ConcreteColleague1*>(pColleague);if(pConcreteColleague1){
cout<<"The message is from ConcreteColleague1. Now mediator forward it to ConcreteColleague2"<<endl;if(m_pColleague2){
m_pColleague2->Notify(message);}}else{if(m_pColleague1){
m_pColleague1->Notify(message);}}}voidSetColleague1(Colleague*pColleague){
m_pColleague1 =dynamic_cast<ConcreteColleague1*>(pColleague);}voidSetColleague2(Colleague*pColleague){
m_pColleague2 =dynamic_cast<ConcreteColleague2*>(pColleague);}private:// The Mediator knows all the ColleagueConcreteColleague1*m_pColleague1;ConcreteColleague2*m_pColleague2;};voidConcreteColleague1::Send(wchar_t*message){// The second parameter mark where the message comes from
m_pMediator->Sent(message,this);}voidConcreteColleague2::Send(wchar_t*message){
m_pMediator->Sent(message,this);}int main(){// Create the mediatorMediator*pMediator =newConcreteMediator();Colleague*pColleague1 =newConcreteColleague1(pMediator);Colleague*pColleague2 =newConcreteColleague2(pMediator);ConcreteMediator*pConcreteMediator =dynamic_cast<ConcreteMediator*>(pMediator);
pConcreteMediator->SetColleague1(pColleague1);
pConcreteMediator->SetColleague2(pColleague2);wchar_t message[260]= L"Where are you from?";
pColleague1->Send(message);return0;}