1、抽象类Media定义
#ifndef MEDIATOR_H
#define MEDIATOR_H
#pragma warning(disable:4786)
#include <map>
#include <string>
#include "Colleague.h"
using namespace std;
class Colleague;
typedef pair<string, Colleague*> Init_Pair;
class Mediator
{
public:
virtual void AddColleague(Colleague*);
virtual void Notified(Colleague*) = 0;
protected:
map<string,Colleague*> m_map;
};
#endif
2、抽象类Mediator实现
#include "Mediator.h"
void Mediator::AddColleague(Colleague* c)
{
m_map.insert(Init_Pair(c->GetName(),c));
}
3、抽象类Colleague定义
#ifndef COLLEAGUE_H
#define COLLEAGUE_H
#include "Mediator.h"
class Mediator;
class Colleague
{
public:
Colleague(Mediator*);
~Colleague();
virtual void Changed();
virtual void Action() = 0;
virtual char* GetName() = 0;
private:
Mediator* m_pm;
};
#endif
4、抽象类Colleague实现
#include "Colleague.h"
Colleague::Colleague(Mediator* media) : m_pm(media)
{
}
Colleague::~Colleague()
{
}
void Colleague::Changed()
{
if(m_pm != NULL)
{
m_pm->Notified(this);
}
}
5、具体类ConcreteMediator定义
#ifndef CONCRETEMEDIATOR_H
#define CONCRETEMEDIATOR_H
#include "Mediator.h"
class ConcreteMediator : public Mediator
{
public:
ConcreteMediator();
~ConcreteMediator();
void Notified(Colleague*);
};
#endif
6、具体类ConcreteColleague实现
#include "ConcreteMediator.h"
#define COLLEAGUE1 "ConcreteColleague1"
#define COLLEAGUE2 "ConcreteColleague2"
#define COLLEAGUE3 "ConcreteColleague3"
ConcreteMediator::ConcreteMediator()
{
}
ConcreteMediator::~ConcreteMediator()
{
}
void ConcreteMediator::Notified(Colleague* c)
{
map<string,Colleague*>::const_iterator iter;
if(!strcmp(c->GetName(),COLLEAGUE1))
{
printf("ConcreteColleague1 changed!/n");
iter = m_map.find(COLLEAGUE2);
iter->second->Action();
iter = m_map.find(COLLEAGUE3);
iter->second->Action();
}
else if(!strcmp(c->GetName(),COLLEAGUE2))
{
printf("ConcreteColleague2 changed!/n");
iter = m_map.find(COLLEAGUE1);
iter->second->Action();
iter = m_map.find(COLLEAGUE3);
iter->second->Action();
}
else if(!strcmp(c->GetName(),COLLEAGUE3))
{
printf("ConcreteColleague3 changed!/n");
iter = m_map.find(COLLEAGUE1);
iter->second->Action();
iter = m_map.find(COLLEAGUE2);
iter->second->Action();
}
}
7、具体类ConcreteColleague1定义
#ifndef CONCRETECOLLEAGUE1_H
#define CONCRETECOLLEAGUE1_H
#include "Colleague.h"
class ConcreteColleague1 : public Colleague
{
public:
ConcreteColleague1(Mediator*);
~ConcreteColleague1();
char* GetName();
void Action();
};
#endif
8、具体类ConcreteColleague1实现
#include "ConcreteColleague1.h"
ConcreteColleague1::ConcreteColleague1(Mediator* media) : Colleague(media)
{
}
ConcreteColleague1::~ConcreteColleague1()
{
}
char* ConcreteColleague1::GetName()
{
return "ConcreteColleague1";
}
void ConcreteColleague1::Action()
{
printf("ConcreteColleague1::Action()/n");
}
9、具体类ConcreteColleague2实现
#ifndef CONCRETECOLLEAGUE2_H
#define CONCRETECOLLEAGUE2_H
#include "Colleague.h"
class ConcreteColleague2 : public Colleague
{
public:
ConcreteColleague2(Mediator*);
~ConcreteColleague2();
char* GetName();
void Action();
};
#endif
10、具体类ConcreteColleague2实现
#include "ConcreteColleague2.h"
ConcreteColleague2::ConcreteColleague2(Mediator* media) : Colleague(media)
{
}
ConcreteColleague2::~ConcreteColleague2()
{
}
char* ConcreteColleague2::GetName()
{
return "ConcreteColleague2";
}
void ConcreteColleague2::Action()
{
printf("ConcreteColleague2::Action()/n");
}
11、具体实现类ConcreteColleague3定义
#ifndef CONCRETECOLLEAGUE3_H
#define CONCRETECOLLEAGUE3_H
#include "Colleague.h"
class ConcreteColleague3 : public Colleague
{
public:
ConcreteColleague3(Mediator*);
~ConcreteColleague3();
char* GetName();
void Action();
};
#endif
12、具体实现类ConcreteColleague3实现
#include "ConcreteColleague3.h"
ConcreteColleague3::ConcreteColleague3(Mediator* media) : Colleague(media)
{
}
ConcreteColleague3::~ConcreteColleague3()
{
}
char* ConcreteColleague3::GetName()
{
return "ConcreteColleague3";
}
void ConcreteColleague3::Action()
{
printf("ConcreteColleague3::Action()/n");
}
13、客户使用类Client实现
#include "Colleague.h"
#include "Mediator.h"
#include "ConcreteMediator.h"
#include "ConcreteColleague1.h"
#include "ConcreteColleague2.h"
#include "ConcreteColleague3.h"
int main()
{
Mediator* md = new ConcreteMediator();
Colleague* c1 = new ConcreteColleague1(md);
Colleague* c2 = new ConcreteColleague2(md);
Colleague* c3 = new ConcreteColleague3(md);
md->AddColleague(c1);
md->AddColleague(c2);
md->AddColleague(c3);
c1->Changed();
c2->Changed();
c3->Changed();
delete c3;
c3 =NULL;
delete c2;
c2 = NULL;
delete c1;
c1 = NULL;
delete md;
md = NULL;
return 0;
}