中介者模式,就是用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地互相引用,从而使其耦合松散,而且可以独立的改变它们之间的交互。
其实中介者模式很简单的,就像它的名字一样,中介,调用某个类的某些方法的时候,我们不直接去跟那个类的实例交互,而是通过一个中间类—中介类,进行交互,这样的模式,就叫中介者模式。
下面通过一个代码示例讲解一下中介者模式
UnitedNations是联合国抽象类,定义一个抽象的declare方法
public abstract class UnitedNations {
public abstract void declare(String message, Country country);
}
Country是国家抽象类,定义了一个内部的UnitedNations属性
public class Country {
protected UnitedNations mediator;
public Country(UnitedNations mediator) {
this.mediator = mediator;
}
}
USA类是Country的具体实现类
public class USA extends Country{
public USA(UnitedNations mediator) {
super(mediator);
}
public void declare(String message){
mediator.declare(message, this);
}
public void getMessage(String message){
System.out.println("美国得到消息:" + message);
}
}
Iraq类是Country的具体实现类
public class Iraq extends Country{
public Iraq(UnitedNations mediator) {
super(mediator);
}
public void declare(String message){
mediator.declare(message, this);
}
public void getMessage(String message) {
System.out.println("伊拉克得到消息:" + message);
}
}
UnitedNationsSecurityCouncil类是UnitedNations的具体实现类
public class UnitedNationsSecurityCouncil extends UnitedNations{
private USA usa;
private Iraq iraq;
public void setUsa(USA usa) {
this.usa = usa;
}
public void setIraq(Iraq iraq) {
this.iraq = iraq;
}
@Override
public void declare(String message, Country country) {
if (country == usa) {
iraq.getMessage(message);
} else {
usa.getMessage(message);
}
}
}
public class MainApp {
public static void main(String[] args) {
UnitedNationsSecurityCouncil unsc = new UnitedNationsSecurityCouncil();
USA usa = new USA(unsc);
Iraq iraq = new Iraq(unsc);
unsc.setUsa(usa);
unsc.setIraq(iraq);
usa.declare("给我石油我就不打你");
iraq.declare("你不打我就给你石油");
}
}
运行结果
伊拉克得到消息:给我石油我就不打你
美国得到消息:你不打我就给你石油
从示例代码可以看出,usa调用了自己的declare方法,想给iraq发信息,但是其实usa没有直接调用iraq的getMessage方法,而是通过调用UnitedNations这个中介,来转发消息,usa将消息发给中介,中介再将消息转发给iraq。
iraq给usa发消息也是同理
通过示例代码能看出中介者模式是什么,但是为什么要使用中介者模式呢?我直接调用目标类的方法不是一样的吗?
其实中介者模式的出现,减少了各个类互相调用之间的耦合性,使得可以独立地改变和复用各个独立的类。比如具体Country的子类改变,并不会影响到调用它的那个类。并且由于把对象间如何协作进行了抽象,将中介作为一个独立的概念并将其封装在一个对象中,这样关注的对象就从对象各自本身的行为转移到它们之间的交互上来,也就是站在一个更宏观的角度去看待系统。
由于中介者类控制了集中化,于是就把交互复杂性变为了中介者的复杂性,这就使得中介者会比任何一个独立的类对象都复杂。
虽然中介者模式使得各个独立对象解耦了,但是中介者对象自己却变得异常复杂,它需要知道所有具体的要相互调用的类的信息,这样中介者类的职责就又变得很多,添加新的对象后也会要修改中介者类。
所以当系统中出现多对多的复杂交互的对象群的时候,不要急着使用中介者模式,先看看系统设计是否合理,最后再考虑是不是使用中介者模式,不然盲目使用中介者模式,会适得其反,增加系统复杂性。