中介者模式
作者:互联网
介绍:
中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。中介者模式属于行为型模式。
定义:
用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
结构图:
代码:
//Mediator类,抽象中介者类
class Mediator
{
public:
void Send(const String &message,const Colleague &cColleague) = 0; //定义一个抽象的发送消息的方法,输入同事对象和消息字段
}
//Colleague类,抽象同事类
class Colleague
{
protect:
Mediator m_cMediator;
public:
//得到中介者对象
Colleague(const Mediator &cMediator)
{
this.m_cMediator = cMediator;
}
//发送消息是通过中介者
void Send(const String &message)
{
m_cMediator.Send(message,this);
}
void Notify(const String &message) = 0;//接到消息的处理需要各个具体同事自己实现
}
//ConcreteMediator类,具体中介者类
class ConcreteMediator : Mediator
{
protect:
//中介者需要了解所有具体同事类
ConcreteColleagueA m_cConcreteColleagueA;
ConcreteColleagueB m_cConcreteColleagueB;
public:
//判断并处理对象间的交互逻辑
void Send(const String &message,const Colleague &cColleague)
{
if(cColleague == m_cConcreteColleagueA)
{
ConcreteColleagueB.Notify(message);
}
else
{
ConcreteColleagueA.Notify(message);
}
}
}
//具体同事类
class ConcreteColleagueA :Colleague
{
public:
//得到中介者对象
Colleague(const Mediator &cMediator)
{
this.m_cMediator = cMediator;
}
//接到消息的具体处理
void Notify(const String &message)
{
。。。;
}
}
class ConcreteColleagueB :Colleague
{
public:
//得到中介者对象
Colleague(const Mediator &cMediator)
{
this.m_cMediator = cMediator;
}
//接到消息的具体处理
void Notify(const String &message)
{
。。。;
}
}
//客户端
Mediator m = new ConcreteMediator()//创建一个中介者
Colleague A = new ConcreteColleagueA(m)//创建一个同事A并让他认识中介者
Colleague B = new ConcreteColleagueB(B)//创建一个同事B并让他认识中介者
m.m_cConcreteColleagueA = A;//让中介者认识A
m.m_cConcreteColleagueB = B;//让中介者认识B
A.Send("Hello");//A通过中介者发送hello给B
A.Send("Nice to meet you");//B接到A的hello,并向A发一个很高兴见到你。
使用时机:
一组定义良好的对象,现在要进行复杂的相互通信。或者想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。
优点:
1、简化了对象之间的关系,将系统的各个对象之间的相互关系进行封装,将各个同事类解耦,使得系统变为松耦合。
2、提供系统的灵活性,使得各个同事对象独立而易于复用。
缺点:
1、中介者模式中,把交互复杂性变成了中介者的复杂性,这就使得中介者比任何一个通讯对象都复杂。
2、新增加一个同事类时,不得不去修改抽象中介者类和具体中介者类,此时可以使用观察者模式和状态模式来解决这个问题。
标签:Colleague,const,Mediator,cMediator,模式,中介,message 来源: https://www.cnblogs.com/haosk/p/13550532.html