【设计模式】我终于读懂了中介者模式。。。

⚾️智能家庭项目

  1. 智能家庭包括各种设备,闹钟、咖啡机、电视机、窗帘 等
  2. 主人要看电视时,各个设备可以协同工作,自动完成看电视的准备工作,比如流程为:闹铃响起->咖啡机开始做咖啡->窗帘自动落下->电视机开始播放

⚾️传统方案解决智能家庭管理问题

在这里插入图片描述

⚾️传统的方式的问题分析

  1. 当各电器对象有多种状态改变时,相互之间的调用关系会比较复杂
  2. 各个电器对象彼此联系,你中有我,我中有你,不利于松耦合.
  3. 各个电器对象之间所传递的消息(参数),容易混乱
  4. 当系统增加一个新的电器对象时,或者执行流程改变时,代码的可维护性、扩展性都不理想 考虑中介者模式

⚾️中介者模式基本介绍

  1. 中介者模式(Mediator Pattern),用一个中介对象来封装一系列的对象交互。中介者使各个对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互
  2. 中介者模式属于行为型模式,使代码易于维护
  3. 比如 MVC 模式,C(Controller 控制器)是 M(Model 模型)和 V(View 视图)的中介者,在前后端交互时起到了中间人的作用

⚾️中介者模式的原理类图

在这里插入图片描述

⚾️对原理类图的说明-即(中介者模式的角色及职责)

  1. Mediator 就是抽象中介者,定义了家居到中介者对象的接口
  2. Colleague 是抽象家居(拥有共同方法的类)类
  3. ConcreteMediator 具体的中介者对象, 实现抽象方法, 他需要知道所有的具体的家居类,即以一个集合来管理
    HashMap,并接受某个家居对象消息,完成相应的任务
  4. ConcreteColleague 具体的家居类,会有很多, 每个家居只知道自己的行为, 而不了解其他家居类的行为(方法), 但是他们都依赖中介者对象

⚾️中介者模式应用实例-智能家庭管理

⚾️应用实例要求

完成前面的智能家庭的项目,使用中介者模式

⚾️思路分析和图解(类图)

在这里插入图片描述

⚾️代码实现

Colleague类,同事抽象类,包含中介者

在这里插入图片描述

四个子类

在这里插入图片描述

Alarm类

在这里插入图片描述

CoffeeMachine类

在这里插入图片描述

Curtains类

在这里插入图片描述

TV类

在这里插入图片描述

ConcreteMediator类

具体的中介者,具体事件由中介者控制,colleagueMap存储所有同事类

在这里插入图片描述

客户端类

在这里插入图片描述

⚾️debug看原理

  1. 创建Alarm

在这里插入图片描述

  1. 加入到 ConcreteMediator 对象的HashMap

在这里插入图片描述

在这里插入图片描述

  1. 其他的三个同事类是一样的

在这里插入图片描述
4. 现在中介者已经接管了四个同事类了

在这里插入图片描述
5. 现在进行我们的需求:闹铃响起->咖啡机开始做咖啡->窗帘自动落下->电视机开始播放

在这里插入图片描述
在这里插入图片描述
6. 调用中介方法

在这里插入图片描述
7. 开始咖啡制作

在这里插入图片描述
在这里插入图片描述
8. 咖啡制作完成

在这里插入图片描述
在这里插入图片描述
9. 发送中介者信息

在这里插入图片描述
10. 拉上窗帘

在这里插入图片描述
在这里插入图片描述
11. 发送信息给中介者

在这里插入图片描述
12. 开启电视

在这里插入图片描述
在这里插入图片描述
13. 闹钟再次想起
在这里插入图片描述
14. 关上电视
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
至此流程走完,每个同事类都没有去调用其他同事类的方法,所有操作都是中介帮忙完成的

⚾️中介者模式在JDK中的运用

  1. jdk中的Timer类就是使用了中介者模式
    Timer是Java提供的原生Scheduler(任务调度)工具类,用来在一个后台线程计划执行指定任务。
  2. 源码解析
    在这里插入图片描述
    有很多的schedule重载方法都调用了sched
    在这里插入图片描述
    在这里插入图片描述

sched方法使用了TaskQueue来存储task,并调用他们的方法

在这里插入图片描述
所以timer类就类似于中介者的身份

⚾️中介者模式的注意事项和细节

  1. 多个类相互耦合,会形成网状结构, 使用中介者模式将网状结构分离为星型结构,进行解耦
  2. 减少类间依赖,降低了耦合,符合迪米特原则
  3. 中介者承担了较多的责任,一旦中介者出现了问题,整个系统就会受到影响
  4. 如果设计不当,中介者对象本身变得过于复杂,这点在实际使用时,要特别注意

总之,通过本文的讲解,相信大家对中介者模式已经有了更深入的理解。中介者模式虽然需要多个对象进行协作,但也因此实现了对象之间的解耦,将复杂性变得更为容易维护和扩展。在开发中,我们可以运用中介者模式来优化代码功能,提高代码可读性、可扩展性和可维护性。如果你在设计中遇到了问题,可以考虑是否使用中介者模式来简化你的程序逻辑。

最后,希望本篇文章能够帮助到各位开发人员,更好地理解并运用中介者模式,提高自己的开发水平和能力。

资料参考:https://www.bilibili.com/video/BV1G4411c7N4

代码地址:https://gitee.com/WangFuGui-Ma/design-pattern/tree/master/design

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/csdnerM/article/details/128315889
今日推荐