中介者模式(Mediator):用一个中介对象来封装一系列的对象交互。中介者是各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互。
中介者模式很容易在系统中应用,也很容易在系统中误用。当系统出现多对多交互复杂的对象群是,不要急于使用中介者模式,而要先反思你的系统在设计上是不是合理。
优点:Mediator的出现减少了各个colleague的耦合,使得可以独立地改变和复用各个colleague类和Mediator;由于把对象如何协作进行了抽象,将中介作为一个独立的概念并将其封装在一个对象中,这样关注的对象就从对象各自本身的行为转移到它们之间的交互上来,也就是站在一个更宏观的角度去看待系统。
中介者模式一般应用于一组对象以定义良好但是复杂的方式进行通信的场合,以及想定制一个分布在多个类中的行为,而又不想生成太多的子类的场合。
#ifndef MEDIATOR_H
#define MEDIATOR_H
#include<iostream>
#include<string>
using namespace std;
class Country;
class UnitedNations
{
public:
virtual void Declare(string message, Country *colleague)=0;
};
class Country
{
protected:
UnitedNations *mediator;
public:
Country(){}
Country(UnitedNations *m) :mediator(m){}
virtual void Declare(string m) = 0;
virtual void GetMessage(string st) = 0;
};
class USA :public Country
{
public:
USA(UnitedNations *m) { mediator = m; }
void Declare(string m)
{
mediator->Declare(m, this);
}
void GetMessage(string m)
{
cout << "美国获得对方信息: " << m << endl;
}
};
class Iraq :public Country
{
public:
Iraq(UnitedNations* m) { mediator = m; }
void Declare(string m)
{
mediator->Declare(m, this);
}
void GetMessage(string m)
{
cout << "伊拉克获得对方信息: " << m << endl;
}
};
class UnitedNationsSecurityCouncil :public UnitedNations
{
Country * colleague1;
Country * colleague2;
public:
void SetColleague1(Country * c1){ colleague1 = c1; }
void SetColleague2(Country * c2){ colleague2 = c2; }
void Declare(string message, Country *colleague)
{
if (colleague == colleague1)
colleague2->GetMessage(message);
else
colleague1->GetMessage(message);
}
};
#endif
#include "Mediator.h"
int main()
{
UnitedNationsSecurityCouncil UNSC;
USA usa(&UNSC);
Iraq iraq(&UNSC);
UNSC.SetColleague1(&usa);
UNSC.SetColleague2(&iraq);
usa.Declare("不准研制核武器,否则要发动战争!");
iraq.Declare("我们没有核武器,也不怕侵略!");
return 0;
}