中介者模式是一种行为型模式
优点:
- 简化了对象之间的关系,将系统的各个对象之间的相互关系进行封装,让原本两两调用的对象解耦。
- 减少了子类生成。
- 简化各个同事类的设计和实现。
缺点:
如果在业务场景中中介者数量过多,会导致系统复杂性增加。
总之,中介者模式在一定程度上可以简化系统的设计,但是也可能会增加系统的复杂性。
与代理模式的对比:
中介者模式是多对多通信,而代理模式是一对一通信。
满足设计原则:
- 中介者模式是迪米特法则的典型应用。迪米特法则又叫最少知识原则,它要求一个对象应该对其他对象保持最少的了解1。
- 中介者模式通过定义一个中介对象来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互2。
- 总之,中介者模式满足了迪米特法则,通过引入中介者对象来减少对象之间的直接交互,降低了系统的耦合度。
常用实例:
例如,在现实生活中,人们可以通过房屋中介来租房,也可以通过人才交流中心来找工作1。
在软件开发中,MVC框架中的控制器(C)就是模型(M)和视图(V)的中介者1。
另一个常见的例子是聊天室。在聊天室中,多人可以在聊天室中聊天,聊天室实例只有一个,用户可以创建多个,并持有聊天室引用2。
类图:
代码:
#include "iostream"
#include "string"
#include "vector"
using namespace std;
class Mediator
{
public:
virtual void send(const string&message,class Colleague*solleague)=0;
};
class Colleague
{
public:
Colleague(Mediator*mediator):mediator(mediator){};
virtual void send(const string &message)=0;
virtual void receive(const string &message)=0;
protected:
Mediator *mediator;
};
class ConcreteColleaguel :public Colleague {
public:
ConcreteColleaguel(Mediator*mediator):Colleague(mediator){};
void send(const string& message) {
mediator->send(message,this);
}
void receive(const string& message)
{
cout<<"Colleaguel received"<<message<<endl;
}
};
class ConcreteColleague2 :public Colleague {
public:
ConcreteColleague2(Mediator*mediator):Colleague(mediator){}
void send(const string& message)
{
mediator->send(message,this);
}
void receive(const string& message)
{
cout<<"Colleague2 received:"<<message<<endl;
}
};
class ConcreteMediator :public Mediator {
private:
ConcreteColleaguel*colleague1;
ConcreteColleague2*colleague2;
public:
void setCollleaguel(ConcreteColleaguel* colleague)
{
colleague1=colleague;
}
void setCollleague2(ConcreteColleague2* colleague)
{
colleague2 = colleague;
}
void send(const string& message, Colleague* colleague)
{
if (colleague == colleague1)
{
colleague2->receive(message);
}
else
{
colleague1->receive(message);
}
}
};
int main()
{
ConcreteMediator mediator;
ConcreteColleaguel c1(&mediator);
ConcreteColleague2 c2(&mediator);
mediator.setCollleaguel(&c1);
mediator.setCollleague2(&c2);
c1.send("dddddd");
c2.send("dddddddddcvccc");
return 0;
}