中介者模式
世界需要和平
由于各国之间代表的利益不同,所以矛盾冲突是在所难免的,联合国组织由各国的代表组成,用来维护国际和平与安全,它就是一个调停者,中介者的角色.国与国之间的关系,就如同不同的对象与对象之间的关系,这就要求对象之间需要知道其他所有的对象,尽管将一个系统分割成许多对象通常可以增加其可复用性,但是对象之间相互连接的激增又会降低其可复用性了.这是因为大量的连接使得一个对象不可能在没有其他对象支持下工作,系统表现为一个不可分割的整体,所以,对系统的行为进行较大的改动就十分困难了.要解决这样的问题,可以应用’迪米特法则’,即如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用.如果一个类需要调用另一个类的某一个方法的话,可以通过第三者来转发这个调用.在本例中,国与国之间完全可以通过’联合国’这个中介者来发生关系,而不用直接通信.之前讲解迪米特法则的时候,是以公司IT部门的管理为例的,其实让我一个刚进公司的人去求任何一个不认识的IT部同事帮忙是有困难的,但如果有IT主管来协调工作,就不至于发生我第一天上班却没有电脑进行工作的局面.IT主管就是一个’中介者’对象.
安理会做中介
//联合国机构
public abstract class UnitedNations {
//得到国家的对象和发送消息
public abstract void declare(String message,Country country);
}
public abstract class Country {
protected UnitedNations mediator;
public Country(UnitedNations mediator) {
this.mediator=mediator;
}
}
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);
}
}
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);
}
}
//联合国安全理事会,隶属于联合国
public class UnitedNationsSecurityCouncil extends UnitedNations {
//联合国安全理事会了解所有的国家,所以拥有美国和伊拉克的对象属性
private USA country1;
private Iraq country2;
public void setCountry1(USA country1) {
this.country1 = country1;
}
public void setCountry2(Iraq country2) {
this.country2 = country2;
}
@Override
public void declare(String message, Country country) {
if(country==country1) {
country2.getMessage(message);
}else {
country1.getMessage(message);
}
}
}
public class Demo {
public static void main(String[] args) {
UnitedNationsSecurityCouncil UNSC=new UnitedNationsSecurityCouncil();
USA c1=new USA(UNSC);
Iraq c2=new Iraq(UNSC);
UNSC.setCountry1(c1);
UNSC.setCountry2(c2);
c1.declare("你敢研制核武器,老子灭了你");
c2.declare("不敢不敢,小弟不敢");
}
}
输出结果:
伊拉克获得对方信息: 你敢研制核武器,老子灭了你
美国获得对方信息: 不敢不敢,小弟不敢
中介者模式:
用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互.
中介者模式的优点:
①国家的改变不会影响到其他国家,而只是与安理会发生变化
②由于把对象如何协作进行了抽象,将中介作为一个概念并将其封装到一个对象中,这样关注的对象就从对象各自本身的行为转移到它们之间的交互上,也就是站在一个更宏观的角度看待系统.比如巴以冲突,本来只能算是国与国之间的矛盾,因此各自的看法可能都比较狭隘,但是站在联合国安理会的角度,就可以从全球化,也更客观地看待这个问题
中介者模式的缺点:
具体中介者类可能因为国家的增多,而变得非常复杂,反而不容易维护了.所以说,中介者模式很容易在系统中应用,也很容易在系统中误用.当系统出现了’多对多’交互复杂的对象群时,不要急于使用中介者模式,而是要先反思你的系统在设计上是不是合理.
何时使用中介者模式:
中介者模式一般应用于一组对象以定义良好但是复杂的方式进行通信的场所,以及想定制一个分布在多个类的行为,而又不想生成太多子类的场合.