定义:用一个中介者对象来封装一系列的对象交互。中介者使各对象不需要显示地相互作用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
使用场景:一堆类需要相互通信构造蜘蛛网结构时,就需要使用中介者降低耦合
实现:定义中介者类,包含通信对象的实例,声明通信方法。定义通信对象抽象类,包含一个中介者类实例,声明通信方法,方法中调用中介者的通信方法,传参为消息+自己的引用。
优点:解耦通信者
缺点:中介者的类会变得很复杂
代码示例:联合国就是各个国家之间的中介
/**
* 联合国
*/
public class UnitedNations {
private Country country1;
private Country country2;
public Country getCountry1() {
return country1;
}
public void setCountry1(Country country1) {
this.country1 = country1;
}
public Country getCountry2() {
return country2;
}
public void setCountry2(Country country2) {
this.country2 = country2;
}
public void forward(Country country,String message) {
if (country == country1) {
country2.getMessage(message);
}else {
country1.getMessage(message);
}
}
}
public abstract class Country {
protected UnitedNations unitedNations;
public Country(UnitedNations unitedNations) {
super();
this.unitedNations = unitedNations;
}
public abstract void send(String message);
public abstract void getMessage(String message);
}
public class China extends Country {
public China(UnitedNations unitedNations) {
super(unitedNations);
}
@Override
public void send(String message) {
this.unitedNations.forward(this, message);
}
@Override
public void getMessage(String message) {
System.out.println("china收到消息:"+message);
}
}
public class USA extends Country {
public USA(UnitedNations unitedNations) {
super(unitedNations);
}
@Override
public void send(String message) {
this.unitedNations.forward(this, message);
}
@Override
public void getMessage(String message) {
System.out.println("usa收到消息:"+message);
}
}
public class Main {
public static void main(String[] args) {
UnitedNations unitedNations = new UnitedNations();
China china = new China(unitedNations);
USA usa = new USA(unitedNations);
unitedNations.setCountry1(china);
unitedNations.setCountry2(usa);
china.send("老实点");
usa.send("好嘞");
}
}
结果: