定义:用一个中介者对象来封装一系列的对象交互。中介者使各对象不需要显示地相互作用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
使用场景:一堆类需要相互通信构造蜘蛛网结构时,就需要使用中介者降低耦合
实现:定义中介者类,包含通信对象的实例,声明通信方法。定义通信对象抽象类,包含一个中介者类实例,声明通信方法,方法中调用中介者的通信方法,传参为消息+自己的引用。
优点:解耦通信者
缺点:中介者的类会变得很复杂
代码示例:联合国就是各个国家之间的中介
/** * 联合国 */ 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("好嘞"); }
}
结果: