1. 意图(Intent)

集中相关对象之间复杂的沟通控制方式

2. 类图(Class Diagram)

30d6e95c-2e3c-4d32-bf4f-68128a70bc05.png

  • Mediator :中介者,定义一个接口用于与各同事(Colleague)对象通信。
  • Colleague:同事,相关对象

    3. 实现(Implementation)

Alarm(闹钟)、CoffeePot(咖啡壶)、Calendar(日历)、Sprinkler(喷头)是一组相关的对象,在某个对象的事件产生时需要去操作其它对象,形成了下面这种依赖结构:
82cfda3b-b53b-4c89-9fdb-26dd2db0cd02.jpg
使用中介者模式可以将复杂的依赖结构变成星形结构:
5359cbf5-5a79-4874-9b17-f23c53c2cb80.jpg
抽象的相关对象类 [ Colleague ]

  1. public abstract class Colleague {
  2. public abstract void onEvent(Mediator mediator);
  3. }

[ ConcreteColleague ]
具体的相关对象警报实现类

  1. public class Alarm extends Colleague {
  2. @Override
  3. public void onEvent(Mediator mediator) {
  4. mediator.doEvent("alarm");
  5. }
  6. public void doAlarm() {
  7. System.out.println("doAlarm()");
  8. }
  9. }

具体的相关对象咖啡壶实现类

  1. public class CoffeePot extends Colleague {
  2. @Override
  3. public void onEvent(Mediator mediator) {
  4. mediator.doEvent("coffeePot");
  5. }
  6. public void doCoffeePot() {
  7. System.out.println("doCoffeePot()");
  8. }
  9. }

具体的相关对象日历表实现类

  1. public class Calender extends Colleague {
  2. @Override
  3. public void onEvent(Mediator mediator) {
  4. mediator.doEvent("calender");
  5. }
  6. public void doCalender() {
  7. System.out.println("doCalender()");
  8. }
  9. }

具体的相关对象洒水壶实现类

  1. public class Sprinkler extends Colleague {
  2. @Override
  3. public void onEvent(Mediator mediator) {
  4. mediator.doEvent("sprinkler");
  5. }
  6. public void doSprinkler() {
  7. System.out.println("doSprinkler()");
  8. }
  9. }

抽象的中介者类 [ Mediator ]

  1. public abstract class Mediator {
  2. public abstract void doEvent(String eventType);
  3. }

具体的中介者实现类 [ ConcreteMediator ]

  1. public class ConcreteMediator extends Mediator {
  2. private Alarm alarm;
  3. private CoffeePot coffeePot;
  4. private Calender calender;
  5. private Sprinkler sprinkler;
  6. public ConcreteMediator(Alarm alarm, CoffeePot coffeePot, Calender calender, Sprinkler sprinkler) {
  7. this.alarm = alarm;
  8. this.coffeePot = coffeePot;
  9. this.calender = calender;
  10. this.sprinkler = sprinkler;
  11. }
  12. @Override
  13. public void doEvent(String eventType) {
  14. switch (eventType) {
  15. case "alarm":
  16. doAlarmEvent();
  17. break;
  18. case "coffeePot":
  19. doCoffeePotEvent();
  20. break;
  21. case "calender":
  22. doCalenderEvent();
  23. break;
  24. default:
  25. doSprinklerEvent();
  26. }
  27. }
  28. public void doAlarmEvent() {
  29. alarm.doAlarm();
  30. coffeePot.doCoffeePot();
  31. calender.doCalender();
  32. sprinkler.doSprinkler();
  33. }
  34. public void doCoffeePotEvent() {
  35. // ...
  36. }
  37. public void doCalenderEvent() {
  38. // ...
  39. }
  40. public void doSprinklerEvent() {
  41. // ...
  42. }
  43. }

客户端演示代码:

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()


4. JDK