中介者模式:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式的例子很多,大到联合国安理会,小到房屋中介,都扮演了中间者的角色,协调各方利益。
使用场合
1、一组对象以定义良好但是复杂的方式进行通信。产生的相互依赖关系结构混乱且难以理解;
2、一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象;
3、想定制一个分布在多个类中的行为,而又不想生成太多的子类。
优缺点
1、减少了子类生成,Mediator将原本分布于多个对象间的行为集中在一起。改变这些行为只需生成Meditator的子类即可。这样各个Colleague类可被重用;
2、它将各Colleague解耦,Mediator有利于各Colleague间的松耦合。你可以独立的改变和复用各Colleague类和Mediator类;
3、它简化了对象协议,用Mediator和Colleague间的一对多的交互来代替多对多的交互。一对多的关系更容易理解、维护和扩展;
4、它对对象如何协作进行了抽象,将中介作为一个独立的概念并将其封装在一个对象中,使你将注意力从对象各自本身的行为转移到它们之间的交互上来。这有助于弄清楚一个系统中的对象是如何交互的;
5、它使控制集中化,中介者模式将交互的复杂性变为中介者的复杂性。因为中介者封装了协议,它可能变得比任一个Colleague都复杂。这可能使得中介者自身成为一个难于维护的庞然大物。
本文就以租房为例子,如果没有房屋中介,那么房客要自己找房东,而房东也要自己找房客,非常不方便。有了房屋中介机构就方便了,房东可以把要出租的房屋信息放到中介机构,而房客可以去中介机构咨询。在软件中,就是多个对象之间需要通信,如果没有中介,对象就需要知道其他对象,最坏情况下,可能需要知道所有其他对象,而有了中介对象就方便多了,对象只需与中介对象通信,而不用知道其他的对象。这就是中介者模式
#include<iostream>
#include<cstring>
using namespace std;
class Person;
class Mediator
{
public:
virtual void Send(string message, Person* person) = 0;
virtual void SendA(Person * A) = 0;
virtual void SendB(Person * B) = 0;
};
class Person
{
protected:
Mediator * m_mediator;
public:
virtual void SetMediator(Mediator * mediator) = 0;
virtual void SendMessage(string message) = 0;
virtual void GetMessage(string message) = 0;
};
class Renter : public Person
{
public:
void SetMediator(Mediator * mediator) { m_mediator = mediator; }
void SendMessage(string message) { m_mediator->Send(message, this); }
void GetMessage(string message) { cout << "renter recev message:"<< message << endl; }
};
class Landlord : public Person
{
public:
void SetMediator(Mediator * mediator) { m_mediator = mediator; }
void SendMessage(string message) { m_mediator->Send(message, this); }
void GetMessage(string message) { cout << "Landlord recev message:" << message << endl; }
};
class HouseMediator : public Mediator
{
public:
HouseMediator():m_A(0),m_B(0) {}
void SendA(Person * A) {m_A = A;}
void SendB(Person * B) {m_B = B;}
void Send(string message, Person * person)
{
if(m_A == person)
{
m_B->GetMessage(message);
}
else
{
m_A->GetMessage(message);
}
}
private:
Person * m_A;
Person * m_B;
};
int main()
{
Mediator * mediator = new HouseMediator();
Person * person1 = new Renter();
Person * person2 = new Landlord();
person1->SetMediator(mediator);
person2->SetMediator(mediator);
mediator->SendA(person1);
mediator->SendB(person2);
person1->SendMessage("Renter");
person2->SendMessage("Landlord");
delete mediator;
delete person1;
delete person2;
return 0;
}