中介者模式(Mediator):又叫调停者模式。用一个中介对象来封装一系列的对象交互。中介者使个对象不需要显示地相互阴影,从而使其耦合松散,而且可以独立地改变它们之间的交互。
中介者结构图如下:
Colleague叫做抽象同事类,而ConcreteColleague是具体同事类,每个具体同事只知道自己的行为,而不了解其他同事类的情况,但它们却都认识中介对象,Mediator是抽象中介者,定义了同事对象到中介者对象的接口,ConcreteMediator是具体中介者对象,实现抽象类的方法,它需要知道所有具体同时类,并从具体同事接收消息,向具体同事对象发送命令。
中介者模式代码模板:
//Mediator类 抽象中介者类
class Mediator
{
public:
//定义一个抽象的发送消息方法,得到同事对象和发送消息
void Send(string message, Colleague colleague);
};
//Colleague类 抽象同事类
class Colleague
{
protected:
Mediator mediator;
public:
//构造方法,得到中介者对象
Colleague(Mediator mediator)
{
this.mediator = mediator;
}
};
ConcreteMediator:public Mediator
{
private:
ConcreteColleague1 colleague1;
ConcreteColleague2 colleague2;
public:
//需要了解所有的具体同事对象
ConcreteColleague1 Colleague1(){}
ConcreteColleague2 Colleague2(){}
void Send(string message, Colleague colleague)
{//重写发送信息的方法,根据对象做出选择判断,通知对象。
if(colleague == colleague1)
{
colleague2.Notify(message);
}
else
{
colleague1.Notify(message);
}
}
};
//ConcreteColleague1 和ConcreteColleague2等各种同事对象
class ConcreteColleague1:public Colleague
{
public:
ConcreteColleague1(Mediator mediator){}
void Send(string mesage)
{
mediator.Send(message, this);
}
void Notify(string message)
{
cout<<"同事1得到消息"<<message;
}
};
class ConcreteColleague2:public Colleague
{
public:
ConcreteColleague2(Mediator mediator){}
void Send(string mesage)
{
mediator.Send(message, this);
}
void Notify(string message)
{
cout<<"同事2得到消息"<<message;
}
};
//客户端调用
void Main()
{
ConcreteMediator m = new ConcreteMediator ();
//让两个具体同事类认识中介对象
ConcreteColleague1 c1 = new ConcreteColleague1 (m);
ConcreteColleague2 c2 = new ConcreteColleague2 (m);
//让中介者认识各个具体同事类对象
m.Colleague1 = c1;
m.Colleague2 = c2;
//具体同事类对象的发送信息都是通过中介者转发
c1.Send("吃过饭了吗?");
c2.Send("没有呢,你打算请客吗?");
}
中介者模式优点:
1、Mediator的出现减少了各个Colleague的耦合,使得可以独立地改变和复用各个Colleague类和Mediator
2、把对象如何写作进行了抽象,将中介作为一个独立的概念并将其封装在一个对象中,这样关注的对象就从对象各自本身的行为转移到它们之间的交互上来,也就是站在一个更宏观的角度去看待系统。
中介者模式缺点:
由于ConcreteMediator控制了集中化,于是就把交互复杂性变为了中介者的复杂性,这就使得中介者会变得比任何一个ConcreteColleague都复杂。