中介者模式的官方定义:
中介者模式使用一个中介对象来封装一系列对象的交互,从而使各对象不需要显式的相互引用,从而使得对象我们耦合松散,而且可以独立地改变对象之间的交互。
普通情况下ColleagueA向ColleagueB、ColleagueC、ColleagueD对象发送消息:
1.首先,在ColleagueA类中需要有一个sendMessage函数,用于向指定的对象发送消息;
2.其次,所有需要接收消息的对象都必须实现Colleague接口,并实现其中的getMessage函数,用于接收消息。
3.sendMessage()函数的实现如下:
private ColleagueB b = new ColleagueB();
private ColleagueC c = new ColleagueC();
private ColleagueD d = new ColleagueD();
public boolean sendMessage(String mess,Colleague colleague){
if(colleague instanceof(ColleagueB))
b.getMessage(message);
else if(colleague instanceof(ColleagueB))
c.getMessage(message);
else if(colleague instanceof(ColleagueB))
d.getMessage(message);
}
在ColleagueA中必须要先创建ColleagueB、ColleagueC、ColleagueD三个对象,然后调用他们各自的getMessage函数给他们发送消息。
在这种方式中,ColleagueA直接向三个对象发送消息,也就是ColleagueA必须要拥有其他三个对象的引用,这样导致ColleagueA与其他三个对象的藕合度高;若要增加消息接收者的时候,就必须要修改ColleagueA中的代码,这违背了“开放扩展,封闭修改”的原则。
使用“中介者模式”向ColleagueA向ColleagueB、ColleagueC、ColleagueD对象发送消息:
引入中介者之后,ColleagueA中只需要包含Mediator对象,无需发送函数;ColleagueA若要向ColleagueB、ColleagueC、ColleagueD发送消息,只需调用Mediator对象的sendMessage(message,colleague)即可。
由于A只与Mediator打交道,与B、C、D并没有直接的关系,因此实现了A与BCD之间的松藕合。
若要增加接收消息的类,只需在Mediator中增加代码,而无需修改ColleagueA中的代码,从而体现了“开放扩展,封闭修改”。
PS:“开放-封闭”原则是针对客户端而言的,是指当调用者/用户使用了一个类库之后,如果类库的功能要增强的时候,客户端代码应该是不需要做任何修改的,这就体现了“封闭修改”的原则,也就是“封闭修改”是针对客户端而言的,被调用的类库中仍然可能有部分代码需要修改,这是允许的。
中介者模式的优点:
Mediator的出现减少了各个Colleague之间的藕合,使得可以独立地改变和复用各个Colleague和Mediator;
其次,由于把对象如何协作进行了抽象,将中介作为一个独立的概念并将其封装在一个对象中,这样关注的对象就从对象各自本身的行为转移到它们之间的交互上来,也就是站在一个更宏观的角度去看待系统。
中介者模式的缺点:
由于Mediator中包含了所有的Colleague对象,所有的控制都在Mediator的sendMessage函数中实现,从而使得中介者过于复杂。
何时运用?
中介者模式一般应用于一组对象之间的通信较为复杂,采用中介者连接所有对象,从而降低各个对象之间的藕合度。