第 21 章 中介者模式

1、智能家庭项目

智能家庭项目:

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

2、传统方案解决智能家庭管理问题

类图

传统的方式的问题分析

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

3、中介者模式基本介绍

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

4、中介者模式的原理类图

  1. Mediator 就是抽象中介者,定义了中介者的行为规范
  2. Colleague 是抽象的同事类,定义了同事类中抽象的行为规范
  3. ConcreteMediator 具体的中介者对象,实现 Mediator 中的抽象方法,他需要知道所有具体的同事类,即以一个集合来管理所有的同事(HashMap),并接收某个同事的消息,完成相应的任务
  4. ConcreteColleague 具体的同事类,Colleague 的实现类会有很多,每个同事只知道自己的行为, 而不了解其他同事类的行为(方法),但是他们都依赖中介者对象(通过构造器将中介者注入)
  5. 原本同事之间复杂的调用关系和业务逻辑,都交给中介者去执行,这样具体的同事类之间耦合度就会降低

5、中介者模式解决智能家庭管理问题

类图


使用步骤

  1. 创建 ConcreteMediator 对象,并使用 Mediator 类型接收
  2. 创建各个同事类对象,比如 AlarmCoffeeMachineTV
  3. 在创建同事类对象时,就直接通过构造器注入一个 Mediator 对象,同时将同事类对象添加至 Mediator 的同事类集合中去
  4. 在同事类对象中调用 sendMessage() 方法时,会去用 Mediator 对象中的 getMessage() 方法
  5. getMessage() 方法会根据会根据当前接收到的消息,去调用其他同事,协同完成其他任务,即 getMessage() 方法会处理很多的业务逻辑,是一个核心方法

代码实现

  1. Colleague:同事类,即为各种家电的抽象父类,通过构造器将中介者对象注入,抽象父类中的 SendMessage() 由子类重写,该方法将调用中介者的 GetMessage() 方法触发执行动作

    //同事抽象类
    public abstract class Colleague {private Mediator mediator;public String name;public Colleague(Mediator mediator, String name) {this.mediator = mediator;this.name = name;}public Mediator GetMediator() {return this.mediator;}public abstract void SendMessage(int stateChange);
    }
    
  2. Alarm

    //具体的同事类
    public class Alarm extends Colleague {// 构造器public Alarm(Mediator mediator, String name) {super(mediator, name);// 在创建Alarm 同事对象时,将自己放入到ConcreteMediator 对象中[集合]mediator.Register(name, this);}public void SendAlarm(int stateChange) {SendMessage(stateChange);}@Overridepublic void SendMessage(int stateChange) {// 调用的中介者对象的getMessagethis.GetMediator().GetMessage(stateChange, this.name);}}
    
  3. CoffeeMachine

    public class CoffeeMachine extends Colleague {public CoffeeMachine(Mediator mediator, String name) {super(mediator, name);mediator.Register(name, this);}@Overridepublic void SendMessage(int stateChange) {this.GetMediator().GetMessage(stateChange, this.name);}public void StartCoffee() {System.out.println("It's time to startcoffee!");}public void FinishCoffee() {System.out.println("After 5 minutes!");System.out.println("Coffee is ok!");SendMessage(0);}
    }
    
  4. TV

    public class TV extends Colleague {public TV(Mediator mediator, String name) {super(mediator, name);mediator.Register(name, this);}@Overridepublic void SendMessage(int stateChange) {this.GetMediator().GetMessage(stateChange, this.name);}public void StartTv() {System.out.println("It's time to StartTv!");}public void StopTv() {System.out.println("StopTv!");}
    }
    
  5. Curtains

    public class Curtains extends Colleague {public Curtains(Mediator mediator, String name) {super(mediator, name);mediator.Register(name, this);}@Overridepublic void SendMessage(int stateChange) {this.GetMediator().GetMessage(stateChange, this.name);}public void UpCurtains() {System.out.println("I am holding Up Curtains!");}}
    
  6. Mediator:定义中介者的行为规范

    public abstract class Mediator {// 将给中介者对象,加入到集合中public abstract void Register(String colleagueName, Colleague colleague);// 接收消息, 消息由具体的同事对象发出public abstract void GetMessage(int stateChange, String colleagueName);public abstract void SendMessage();}
    
  7. ConcreteMediator:继承了 Mediator 抽象父类,实现了其父类中的抽象方法,Register() 完成注册的功能,调用 GetMessage() 方法将执行目标任务

    //具体的中介者类
    public class ConcreteMediator extends Mediator {// 集合,放入所有的同事对象private HashMap<String, Colleague> colleagueMap;private HashMap<String, String> interMap;public ConcreteMediator() {colleagueMap = new HashMap<String, Colleague>();interMap = new HashMap<String, String>();}@Overridepublic void Register(String colleagueName, Colleague colleague) {colleagueMap.put(colleagueName, colleague);if (colleague instanceof Alarm) {interMap.put("Alarm", colleagueName);} else if (colleague instanceof CoffeeMachine) {interMap.put("CoffeeMachine", colleagueName);} else if (colleague instanceof TV) {interMap.put("TV", colleagueName);} else if (colleague instanceof Curtains) {interMap.put("Curtains", colleagueName);}}// 具体中介者的核心方法// 1. 根据得到消息,完成对应任务// 2. 中介者在这个方法,协调各个具体的同事对象,完成任务@Overridepublic void GetMessage(int stateChange, String colleagueName) {// 处理闹钟发出的消息if (colleagueMap.get(colleagueName) instanceof Alarm) {if (stateChange == 0) {((CoffeeMachine) (colleagueMap.get(interMap.get("CoffeeMachine")))).StartCoffee();((TV) (colleagueMap.get(interMap.get("TV")))).StartTv();} else if (stateChange == 1) {((TV) (colleagueMap.get(interMap.get("TV")))).StopTv();}} else if (colleagueMap.get(colleagueName) instanceof CoffeeMachine) {((Curtains) (colleagueMap.get(interMap.get("Curtains")))).UpCurtains();} else if (colleagueMap.get(colleagueName) instanceof TV) {// 如果TV发现消息} else if (colleagueMap.get(colleagueName) instanceof Curtains) {// 如果是以窗帘发出的消息,这里处理...}}@Overridepublic void SendMessage() {}}
    
  8. ClientTest:测试代码

    public class ClientTest {public static void main(String[] args) {// 创建一个中介者对象Mediator mediator = new ConcreteMediator();// 创建Alarm 并且加入到 ConcreteMediator 对象的HashMapAlarm alarm = new Alarm(mediator, "alarm");// 创建了CoffeeMachine 对象,并 且加入到 ConcreteMediator 对象的HashMapCoffeeMachine coffeeMachine = new CoffeeMachine(mediator, "coffeeMachine");// 创建 Curtains , 并 且加入到 ConcreteMediator 对象的HashMapCurtains curtains = new Curtains(mediator, "curtains");TV tV = new TV(mediator, "TV");// 让闹钟发出消息alarm.SendAlarm(0);coffeeMachine.FinishCoffee();alarm.SendAlarm(1);}}
    

总结

  1. 中介者(Mediator)将各种家电对象分隔开来,家电与家电之间没有发生关联,家电执行的任务都是交给中介者触发
  2. 中介者模式可以提高程序的可扩展性,比如我们新增电话类 Phone,我们只需要修改 ConcreteMediator 中的代码即可实现扩展

6、中介者模式的注意事项和细节

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

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

第 21 章 中介者模式相关推荐

  1. Java设计模式(九)—中介者模式、备忘录模式、解释器模式

    本章目录标题 第21章 中介者模式 21.1 应用场景:智能家居 21.2 传统方式 21.3 中介者模式 21.4 应用案例:智能家居 21.5 中介者模式的注意事项 第22章 备忘录模式 22.1 ...

  2. 设计模式之中介者模式---Mediator Pattern

    模式的定义 中介者模式定义如下: Define an object that encapsulates how a set of objects interact.Mediator promotes ...

  3. [Java]观察者模式和中介者模式改造机场

    [Java]观察者模式和中介者模式改造机场 文章目录 [Java]观察者模式和中介者模式改造机场 题目 代码部分 运行结果 补充 题目 请以下面的情景为基础,将以下的情景进行 优化: 1. 定义4个处 ...

  4. 设计模式:第四章 中介模式

    第四章 中介模式 1. 核心思想 2. UML类图 3. 代码框架 4. 模型说明 4.1 设计要点 4.2 优缺点 5. 应用场景 注1 1. 核心思想 由中介来承接房客与房东之间的交互过程,可以使 ...

  5. 设计模式-中介者模式(21)

    定义 中介者模式(Mediator)也称调停者模式,是一种比较简单的模式. 英文:Define an object that encapsulates how a set of objects int ...

  6. 第十九章行为型模式—中介者模式

    文章目录 中介者模式 解决的问题 结构 实例 存在的问题 适用场景 中介者模式和代理模式的区别 代理模式 中介模式 桥接模式 总结 行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间 ...

  7. 设计模式之中介者模式(Mediator)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  8. (七)中介者模式-C++实现

    用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显示地相互引用,从而使其解耦合松散而且可以独立地改变他们之间的交互. 中介者模式适合于 系统中不希望对象之间直接交互,即不希望类之间相互包含, ...

  9. C#设计模式之十七中介者模式(Mediator Pattern)【行为型】

    一.引言 今天我们开始讲"行为型"设计模式的第五个模式,该模式是[中介者模式],英文名称是:Mediator Pattern.还是老套路,先从名字上来看看."中介者模式& ...

最新文章

  1. 关于使用strtok的一个小问题
  2. 京东数科宣布机房巡检AI机器人落地金融机构数据中心
  3. Python的正则表达式和爬虫
  4. linux centos/debian下hadoop2.6.5单机伪分布式安装
  5. java中自定义输入数字格式_Java 创建并使用自定义数字格式、35;###、####.#####和语言环境...
  6. 新一批国产游戏版号下发:共53款 腾讯、网易在列
  7. 在Ubuntu中部署并测试Fabric 1.0 Beta
  8. 【每日算法Day 101】字节跳动 AI Lab 精选面试编程题
  9. 转liunx 常用命令
  10. C - The Smallest String Concatenation CodeForces - 632C(按字典序列排列 )string或者数组
  11. vfp mysql教程_VFP基础教程 5.5 编辑框控件(editbox)
  12. 全国计算机等级考试怎么卸载,教你三种方法卸载Windows7SP1Beta
  13. EXCEL-数据透视表、日数据整理成月数据
  14. oracle取差集效率如何,Oracle Minus 取差集
  15. 解决ubuntu开机变慢;删除耗时启动项
  16. 仿掘金社区全栈项目开发(二)-前端工程化
  17. 可变悬挂调节软硬_大众cc可变悬架软硬调节是什么意思
  18. echarts改变字体颜色
  19. 2020.5.9测试 T3 数星星
  20. perl里嵌套shell命令转义符_Linux-包教包会系列之-shell

热门文章

  1. 中国基因工程行业市场供需与战略研究报告
  2. 2017年UI、Web、微服务顶级框架都有啥?不看就落伍了1
  3. 面面俱到,这 23 个公共数据集赶紧Mark起来!
  4. 一个快速排序写了快 10000 字?
  5. 还在 Bug 不断?不妨试试这 2 个装X技巧
  6. CSDN 日报第 1 期:蚂蚁集团将向机构投资者退款;Pyston v2 发布 比 Python 快 20%
  7. 2020 OPPO 开发者大会重磅推出 ColorOS 11,适配机型达 33 种
  8. 一文读懂数据平台、大数据平台、数据中台
  9. 蚂蚁金服推出分布式的图神经知识表示框架,性能和可扩展性俱佳
  10. 直播围观!百度大脑智能监控如何为安全生产保驾护航?