目录
中介者模式又叫调停模式,定义一个中介角色来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。
中介者模式可以使对象之间的关系数量急剧减少,通过引入中介者对象,可以将系统的网状结构变成以中介者为中心的星形结构,任何一个类的变动,只会影响的类本身,以及中介者,这样就减小了系统的耦合。一个好的设计,必定不会把所有的对象关系处理逻辑封装在本类中,而是使用一个专门的类来管理那些不属于自己的行为。

Mediator: 中介者,定义一个接口用于与各同事(Colleague)对象通信。
Colleague: 同事,相关对象
案例:Alarm(闹钟)、CoffeePot(咖啡壶)、Calendar(日历)、Sprinkler(喷头)是一组相关的对象,在某个对象的事件产生时需要去操作其它对象,形成了下面这种依赖结构:

使用中介者模式可以将复杂的依赖结构变成星形结构:

- public abstract class Colleague {
- public abstract void onEvent(Mediator mediator);
- }
-
- public class Alarm extends Colleague {
- @Override
- public void onEvent(Mediator mediator) {
- mediator.doEvent("alarm");
- }
-
- public void doAlarm() {
- System.out.println("doAlarm()");
- }
- }
-
- public class CoffeePot extends Colleague {
- @Override
- public void onEvent(Mediator mediator) {
- mediator.doEvent("coffeePot");
- }
-
- public void doCoffeePot() {
- System.out.println("doCoffeePot()");
- }
- }
-
- public class Calender extends Colleague {
- @Override
- public void onEvent(Mediator mediator) {
- mediator.doEvent("calender");
- }
-
- public void doCalender() {
- System.out.println("doCalender()");
- }
- }
-
- public class Sprinkler extends Colleague {
- @Override
- public void onEvent(Mediator mediator) {
- mediator.doEvent("sprinkler");
- }
-
- public void doSprinkler() {
- System.out.println("doSprinkler()");
- }
- }
- public abstract class Mediator {
- public abstract void doEvent(String eventType);
- }
- public class ConcreteMediator extends Mediator {
- private Alarm alarm;
- private CoffeePot coffeePot;
- private Calender calender;
- private Sprinkler sprinkler;
-
- public ConcreteMediator(Alarm alarm, CoffeePot coffeePot, Calender calender, Sprinkler sprinkler) {
- this.alarm = alarm;
- this.coffeePot = coffeePot;
- this.calender = calender;
- this.sprinkler = sprinkler;
- }
-
- @Override
- public void doEvent(String eventType) {
- switch (eventType) {
- case "alarm":
- doAlarmEvent();
- break;
- case "coffeePot":
- doCoffeePotEvent();
- break;
- case "calender":
- doCalenderEvent();
- break;
- default:
- doSprinklerEvent();
- }
- }
-
- public void doAlarmEvent() {
- alarm.doAlarm();
- coffeePot.doCoffeePot();
- calender.doCalender();
- sprinkler.doSprinkler();
- }
-
- public void doCoffeePotEvent() {
- // ...
- }
-
- public void doCalenderEvent() {
- // ...
- }
-
- public void doSprinklerEvent() {
- // ...
- }
- }
- public class Client {
- public static void main(String[] args) {
- Alarm alarm = new Alarm();
- CoffeePot coffeePot = new CoffeePot();
- Calender calender = new Calender();
- Sprinkler sprinkler = new Sprinkler();
- Mediator mediator = new ConcreteMediator(alarm, coffeePot, calender, sprinkler);
- // 闹钟事件到达,调用中介者就可以操作相关对象
- alarm.onEvent(mediator);
- }
- }
- doAlarm()
- doCoffeePot()
- doCalender()
- doSprinkler()
优点
1. 松散耦合:中介者模式通过把多个同事对象之间的交互封装到中介者对象里面,从而使得同事对象之间松散耦合,基本上可以做到互补依赖。这样一来,同事对象就可以独立地变化和复用,而不再像以前那样“牵一处而动全身”了。
2. 集中控制交互:多个同事对象的交互,被封装在中介者对象里面集中管理,使得这些交互行为发生变化的时候,只需要修改中介者对象就可以了,当然如果是已经做好的系统,那么就扩展中介者对象,而各个同事类不需要做修改。
3. 一对多关联转变为一对一的关联:没有使用中介者模式的时候,同事对象之间的关系通常是一对多的,引入中介者对象以后,中介者对象和同事对象的关系通常变成双向的一对一,这会让对象的关系更容易理解和实现。
缺点
当同事类太多时,中介者的职责将很大,它会变得复杂而庞大,以至于系统难以维护。
JDK中的中介者模式
java.util.concurrent.Executor#execute()
submit() and invokeXXX() methods of java.util.concurrent.ExecutorService
scheduleXXX() methods of java.util.concurrent.ScheduledExecutorService
java.lang.reflect.Method#invoke()