• 设计模式 - 中介者模式


    目录

    一. 前言

    二. 实现

    三. 优缺点


    一. 前言

        中介者模式又叫调停模式,定义一个中介角色来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。

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

    二. 实现

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

    案例:Alarm(闹钟)、CoffeePot(咖啡壶)、Calendar(日历)、Sprinkler(喷头)是一组相关的对象,在某个对象的事件产生时需要去操作其它对象,形成了下面这种依赖结构:

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

    1. public abstract class Colleague {
    2. public abstract void onEvent(Mediator mediator);
    3. }
    4. public class Alarm extends Colleague {
    5. @Override
    6. public void onEvent(Mediator mediator) {
    7. mediator.doEvent("alarm");
    8. }
    9. public void doAlarm() {
    10. System.out.println("doAlarm()");
    11. }
    12. }
    13. public class CoffeePot extends Colleague {
    14. @Override
    15. public void onEvent(Mediator mediator) {
    16. mediator.doEvent("coffeePot");
    17. }
    18. public void doCoffeePot() {
    19. System.out.println("doCoffeePot()");
    20. }
    21. }
    22. public class Calender extends Colleague {
    23. @Override
    24. public void onEvent(Mediator mediator) {
    25. mediator.doEvent("calender");
    26. }
    27. public void doCalender() {
    28. System.out.println("doCalender()");
    29. }
    30. }
    31. public class Sprinkler extends Colleague {
    32. @Override
    33. public void onEvent(Mediator mediator) {
    34. mediator.doEvent("sprinkler");
    35. }
    36. public void doSprinkler() {
    37. System.out.println("doSprinkler()");
    38. }
    39. }
    1. public abstract class Mediator {
    2. public abstract void doEvent(String eventType);
    3. }
    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. }
    1. public class Client {
    2. public static void main(String[] args) {
    3. Alarm alarm = new Alarm();
    4. CoffeePot coffeePot = new CoffeePot();
    5. Calender calender = new Calender();
    6. Sprinkler sprinkler = new Sprinkler();
    7. Mediator mediator = new ConcreteMediator(alarm, coffeePot, calender, sprinkler);
    8. // 闹钟事件到达,调用中介者就可以操作相关对象
    9. alarm.onEvent(mediator);
    10. }
    11. }
    1. doAlarm()
    2. doCoffeePot()
    3. doCalender()
    4. 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()

  • 相关阅读:
    AidAim Single File虚拟存档/备份库
    C---字符串
    软件工程与计算总结(二十一)软件维护与演化
    【计算机视觉 | 目标检测】arxiv 计算机视觉关于目标检测的学术速递(9 月 1 日论文合集)
    如何进入TB top排行榜查找热卖款的宝贝呢?
    必知必会的22种设计模式(GO语言)
    软件开发项目文档系列之十如何撰写测试用例
    Qt Style Sheets
    vue--2.方法、事件绑定、样式绑定、条件渲染和循环渲染
    几个事件的问题
  • 原文地址:https://blog.csdn.net/mrluo735/article/details/133742269