1 定义
用一个对象来封装一系列的对象交互。中介者使各对象不需要显示的互相引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
2 优点
- 中介者的出现降低了各个交互对象之间的耦合性,使得可以独立和复用所有的交互对象类、中介者类。
- 由于把对象如何协作进行了抽象,将中介作为一个独立的概念并将其封装在一个对象中,这样关注的对象就从对象各自本身的行为转移到了它们之间的交互上来,也就是站在一个更宏观的角度去看待系统。
3 缺点
由于中介者控制出现了集中化,于是交互复杂性变成了中介者的复杂性,这就使得中介者变得比任何一个交互类都复杂。所以说它的缺点来源于它的优点。
4 适用场景
一组对象以定义良好但是复杂的方式进行通信的场合,以及想定制一个分布在多个类中的行为,而又不想生成太多的子类的场合。
5 UML
6 例子
6.1 场景
美国和朝鲜之间的对话需要通过联合国安理会。美国和朝鲜就是通信的具体类;联合国安理会就是具体中介者。
6.2 UML
6.3 code
Main
public class Main {
public static void main(String[] args) {
UnitedNationsAnLiHui anLiHui=new UnitedNationsAnLiHui();
USA c1=new USA(anLiHui);
Iraq c2=new Iraq(anLiHui);
anLiHui.setColleague1(c1);
anLiHui.setColleague2(c2);
c1.declare("不准研制核武器,否则发动战争");
c2.declare("我们没有研制核武器,也不怕侵略");
}
}
UniteNations
//联合国机构
public abstract class UniteNations {
public abstract void declare(String message,Country colleague);
}
UnitedNationsAnLiHui
//联合国安理会
public class UnitedNationsAnLiHui extends UniteNations {
private USA colleague1;
private Iraq colleague2;
@Override
public void declare(String message, Country colleague) {
if(colleague==colleague1){
colleague2.getMessage(message);
}else{
colleague1.getMessage(message);
}
}
public USA getColleague1() {
return colleague1;
}
public void setColleague1(USA colleague1) {
this.colleague1 = colleague1;
}
public Iraq getColleague2() {
return colleague2;
}
public void setColleague2(Iraq colleague2) {
this.colleague2 = colleague2;
}
}
Country
//国家
public abstract class Country {
protected UniteNations mediator;
public Country(UniteNations mediator){
this.mediator=mediator;
}
}
USA
public class USA extends Country {
public USA(UniteNations mediator) {
super(mediator);
}
//声明
public void declare(String message){
mediator.declare(message,this);
}
//获得消息
public void getMessage(String message){
System.out.println("美方获得对象消息:"+message);
}
}
Iraq
//伊拉克
public class Iraq extends Country {
public Iraq(UniteNations mediator) {
super(mediator);
}
//声明
public void declare(String message){
mediator.declare(message,this);
}
//获得消息
public void getMessage(String message){
System.out.println("伊拉克获得对象消息:"+message);
}
}