用一个中介对象Mediator来封装其它对象之间的交互,每个其它类型的对象只与Mediator交互。
每个其它类型对象都包含有同一个Mediator指针,Mediator中包含有所有其他类型对象指针。
每个其它类型对象调用Mediator接口,由Mediator对其它对象进行操作。
#include <iostream>
using namespace std;
class Mediator;
//colleague基类,每个colleague都保存一个Mediator,colleague只与Mediator有交互
class Colleague
{
public:
Colleague(int i, Mediator* p):value(i), pm(p){}
virtual ~Colleague(){}
virtual void CopyMineToAnother() = 0;
int GetValue() const {return value;}
void SetValue(int i) {value = i;}
protected:
Mediator* pm;
private:
//用来区分colleague
int value;
};
class ColleagueA: public Colleague
{
public:
ColleagueA(Mediator* p, int i):Colleague(i,p){}
void CopyMineToAnother();
};
class ColleagueB: public Colleague
{
public:
ColleagueB(Mediator* p, int i):Colleague(i,p){}
void CopyMineToAnother();
};
//Mediator
class Mediator
{
public:
//传入colleague的接口
void SetColleague(Colleague* a, Colleague* b)
{
pa = a;
pb = b;
}
//协作colleague的接口
void AtoB()
{
int i = pa->GetValue();
pb->SetValue(i);
}
void BtoA()
{
int i = pb->GetValue();
pa->SetValue(i);
}
private:
Colleague* pa;
Colleague* pb;
};
void ColleagueA::CopyMineToAnother()
{
//colleague内部只与Mediator交互
pm->AtoB();
}
void ColleagueB::CopyMineToAnother()
{
//colleague内部只与Mediator交互
pm->BtoA();
}
int main()
{
Mediator* pm = new Mediator;
Colleague* pa = new ColleagueA(pm, 2);
Colleague* pb = new ColleagueB(pm, 5);
//设置Mediator中的colleague
pm->SetColleague(pa,pb);
//获得a和b的值
cout<<pa->GetValue()<<endl;
cout<<pb->GetValue()<<endl;
//调用CopyMineToAnother,在其内部只与Mediator交互
pa->CopyMineToAnother();
//b的值被改变
cout<<pb->GetValue()<<endl;
delete pa;
delete pb;
delete pm;
return 0;
}