中介者模式C++实现
1定义
用一个中介对象封装一系列的对象交互,中介者使各个对象不需要显示的相互作用,从而使其耦合松散,而且可以独立的改变他们之间的交互
2类图
组成说明
Mediator抽象中介者角色,定义统一接口,用于各个同事角色之间的通信
ConcreteMediator具体中介者角色,通过协调各个同事角色实现协作行为,依赖于各个同事
Colleague同事角色,每个同事角色都应该知道中介的存在,且同事间通信一定是通过中介协作;同事行为分:自发行为,依赖行为。
3实现
class Mediator
{
protected:
Mediator();
public:
virtual ~Mediator()=0;
protected:
ConcreteColleague1 c1;
ConcreteColleague2 c2;
public:
ConcreteColleague1 *getC1()
{
return c1;
}
ConcreteColleague2 *getC2()
{
return c2;
}
virtual void doSomething1() = 0;
virtual void doSomething2() = 0;
};
//中介者
class ConcreteMediator:public Mediator
{
public:
void doSomething1()
{}
void doSomething2()
{}
};
class Colleague
{
public:
Colleague(Mediator me)
:mediator(me)
{}
public:
virtual ~Colleague()=0;
protected:
Mediator mediator;
};
class ConcreteColleague1: public Colleague
{
public:
ConcreteColleague1(Mediator me)
:Colleague(me)
{}
void Self_method1()
{}
//依赖方法
void depMethod1()
{
//处理自己的业务
//自己不能够处理的业务交给中介,让其进行通信协作
mediator.doSomething2();
}
};
class ConcreteColleague2: public Colleague
{
public:
ConcreteColleague2(Mediator me)
:Colleague(me)
{}
void Self_method2()
{}
//依赖方法
void depMethod2()
{
//处理自己的业务
//自己不能够处理的业务交给中介,让其进行通信协作
mediator.doSomething2();
}
};
注:同事类使用构造函数注入中介者,而中介者使用setter/getter注入同事类,因为同事类必须有中介者,而中介者只有部分同事类
4应用
①优点
减少类间依赖,把一对多的依赖转变成一对一。同事类只依赖中介,降低类间耦合
②缺点,中介者会随着同事类的增多,逻辑越来越复杂
5使用场景
简单但是不容易使用的一个模式。把握一个准则:当类图中出现蜘蛛网时,尝试使用中介者
实际应用:机场调度中心,MVC框架中的C(Controller),媒体网关,中介服务。
6提示-最佳使用
N个对象间产生依赖关系(N>2)
多个对象有依赖关系,但是尚不确定或者有发生改变的可能,使用中介者降低风险扩散
产品开发:eg MVC框架。把中介者模式应用到产品中,可以提升产品性能和扩展性,但是对项目就未必。项目是以支付投产为目标,而产品则是以稳定,高效扩展为宗旨。