第 21 章 中介者模式
第 21 章 中介者模式
1、智能家庭项目
智能家庭项目:
- 智能家庭包括各种设备,闹钟、咖啡机、电视机、窗帘 等
- 主人要看电视时,各个设备可以协同工作,自动完成看电视的准备工作,比如流程为: 闹铃响起 --> 咖啡机开始做咖啡 --> 窗帘自动落下 --> 电视机开始播放
2、传统方案解决智能家庭管理问题
类图
传统的方式的问题分析
- 当各电器对象有多种状态改变时,相互之间的调用关系会比较复杂
- 各个电器对象彼此联系, 你中有我,我中有你,不利于松耦合
- 各个电器对象之间所传递的消息(参数),容易混乱
- 当系统增加一个新的电器对象时,或者执行流程改变时,代码的可维护性、扩展性都不理想 ==> 考虑中介者模式
3、中介者模式基本介绍
- 中介者模式(
Mediator Pattern
) , 用一个中介对象来封装一系列的对象交互。中介者使各个对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互 - 中介者模式属于行为型模式, 使代码易于维护
- 比如
MVC
模式,C
(Controller
控制器)是M
(Model
模型)和V
(View
视图)的中介者,在前后端交互时起到了中间人的作用
4、中介者模式的原理类图
Mediator
就是抽象中介者,定义了中介者的行为规范Colleague
是抽象的同事类,定义了同事类中抽象的行为规范ConcreteMediator
具体的中介者对象,实现Mediator
中的抽象方法,他需要知道所有具体的同事类,即以一个集合来管理所有的同事(HashMap
),并接收某个同事的消息,完成相应的任务ConcreteColleague
具体的同事类,Colleague
的实现类会有很多,每个同事只知道自己的行为, 而不了解其他同事类的行为(方法),但是他们都依赖中介者对象(通过构造器将中介者注入)- 原本同事之间复杂的调用关系和业务逻辑,都交给中介者去执行,这样具体的同事类之间耦合度就会降低
5、中介者模式解决智能家庭管理问题
类图
使用步骤
- 创建
ConcreteMediator
对象,并使用Mediator
类型接收 - 创建各个同事类对象,比如
Alarm
、CoffeeMachine
、TV
等 - 在创建同事类对象时,就直接通过构造器注入一个
Mediator
对象,同时将同事类对象添加至Mediator
的同事类集合中去 - 在同事类对象中调用
sendMessage()
方法时,会去用Mediator
对象中的getMessage()
方法 getMessage()
方法会根据会根据当前接收到的消息,去调用其他同事,协同完成其他任务,即getMessage()
方法会处理很多的业务逻辑,是一个核心方法
代码实现
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); }
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);}}
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);} }
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!");} }
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!");}}
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();}
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() {}}
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);}}
总结
- 中介者(
Mediator
)将各种家电对象分隔开来,家电与家电之间没有发生关联,家电执行的任务都是交给中介者触发 - 中介者模式可以提高程序的可扩展性,比如我们新增电话类
Phone
,我们只需要修改ConcreteMediator
中的代码即可实现扩展
6、中介者模式的注意事项和细节
中介者模式的注意事项和细节
- 多个类相互耦合, 会形成网状结构,使用中介者模式将网状结构分离为星型结构, 进行解耦
- 减少类间依赖, 降低了耦合, 符合迪米特原则
- 中介者承担了较多的责任, 一旦中介者出现了问题, 整个系统就会受到影响
- 如果设计不当, 中介者对象本身变得过于复杂, 这点在实际使用时, 要特别注意
第 21 章 中介者模式相关推荐
- Java设计模式(九)—中介者模式、备忘录模式、解释器模式
本章目录标题 第21章 中介者模式 21.1 应用场景:智能家居 21.2 传统方式 21.3 中介者模式 21.4 应用案例:智能家居 21.5 中介者模式的注意事项 第22章 备忘录模式 22.1 ...
- 设计模式之中介者模式---Mediator Pattern
模式的定义 中介者模式定义如下: Define an object that encapsulates how a set of objects interact.Mediator promotes ...
- [Java]观察者模式和中介者模式改造机场
[Java]观察者模式和中介者模式改造机场 文章目录 [Java]观察者模式和中介者模式改造机场 题目 代码部分 运行结果 补充 题目 请以下面的情景为基础,将以下的情景进行 优化: 1. 定义4个处 ...
- 设计模式:第四章 中介模式
第四章 中介模式 1. 核心思想 2. UML类图 3. 代码框架 4. 模型说明 4.1 设计要点 4.2 优缺点 5. 应用场景 注1 1. 核心思想 由中介来承接房客与房东之间的交互过程,可以使 ...
- 设计模式-中介者模式(21)
定义 中介者模式(Mediator)也称调停者模式,是一种比较简单的模式. 英文:Define an object that encapsulates how a set of objects int ...
- 第十九章行为型模式—中介者模式
文章目录 中介者模式 解决的问题 结构 实例 存在的问题 适用场景 中介者模式和代理模式的区别 代理模式 中介模式 桥接模式 总结 行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间 ...
- 设计模式之中介者模式(Mediator)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
- (七)中介者模式-C++实现
用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显示地相互引用,从而使其解耦合松散而且可以独立地改变他们之间的交互. 中介者模式适合于 系统中不希望对象之间直接交互,即不希望类之间相互包含, ...
- C#设计模式之十七中介者模式(Mediator Pattern)【行为型】
一.引言 今天我们开始讲"行为型"设计模式的第五个模式,该模式是[中介者模式],英文名称是:Mediator Pattern.还是老套路,先从名字上来看看."中介者模式& ...
最新文章
- 关于使用strtok的一个小问题
- 京东数科宣布机房巡检AI机器人落地金融机构数据中心
- Python的正则表达式和爬虫
- linux centos/debian下hadoop2.6.5单机伪分布式安装
- java中自定义输入数字格式_Java 创建并使用自定义数字格式、35;###、####.#####和语言环境...
- 新一批国产游戏版号下发:共53款 腾讯、网易在列
- 在Ubuntu中部署并测试Fabric 1.0 Beta
- 【每日算法Day 101】字节跳动 AI Lab 精选面试编程题
- 转liunx 常用命令
- C - The Smallest String Concatenation CodeForces - 632C(按字典序列排列 )string或者数组
- vfp mysql教程_VFP基础教程 5.5 编辑框控件(editbox)
- 全国计算机等级考试怎么卸载,教你三种方法卸载Windows7SP1Beta
- EXCEL-数据透视表、日数据整理成月数据
- oracle取差集效率如何,Oracle Minus 取差集
- 解决ubuntu开机变慢;删除耗时启动项
- 仿掘金社区全栈项目开发(二)-前端工程化
- 可变悬挂调节软硬_大众cc可变悬架软硬调节是什么意思
- echarts改变字体颜色
- 2020.5.9测试 T3 数星星
- perl里嵌套shell命令转义符_Linux-包教包会系列之-shell
热门文章
- 中国基因工程行业市场供需与战略研究报告
- 2017年UI、Web、微服务顶级框架都有啥?不看就落伍了1
- 面面俱到,这 23 个公共数据集赶紧Mark起来!
- 一个快速排序写了快 10000 字?
- 还在 Bug 不断?不妨试试这 2 个装X技巧
- CSDN 日报第 1 期:蚂蚁集团将向机构投资者退款;Pyston v2 发布 比 Python 快 20%
- 2020 OPPO 开发者大会重磅推出 ColorOS 11,适配机型达 33 种
- 一文读懂数据平台、大数据平台、数据中台
- 蚂蚁金服推出分布式的图神经知识表示框架,性能和可扩展性俱佳
- 直播围观!百度大脑智能监控如何为安全生产保驾护航?