23种设计模式之中介者模式
中介者模式的定义
中介者模式, 当多个类彼此关联, 会增大耦合性, 这时各个模块通过中介者进行交流, 每个模块只负责自己的业务逻辑, 不属于自己的就丢给中介者, 降低耦合
定义: 用一个中介对象封装一系列的对象交互, 中介者使各对象不需要显示的相互作用,从而使其耦合松散,而且可以独立的改变他们之间的交互.
通用类图如下:
由以下几部分组成:
- AbstractMediator 抽象中介者: 抽象中介者角色定义统一的接口, 用于各同事角色之间的通信.
- Mediator 具体中介者: 具体中介者角色通过协调各同事角色实现协作行为,因此它必须依赖各个同事角色
- AbstractColleague 抽象同事角色: 每一个同事角色都知道中介者角色, 而且与其他同事通信的时候, 一定要通过中介者角色协作.每个同事类的行为分为两种: 一种是同事本身的行为,叫做自发行为,与其他的同事类或中介者没有任何的依赖; 第二种是必须依赖中介者才能完成的行为, 叫做依赖方法
抽象中介者代码:
具体中介者代码:
抽象同事类代码:
这个类代码非常简单,就是为了建立这个中介而服务的
具体同事类代码:
为什么同事类要使用构造函数注入中介者,而中介者使用 getter/setter 方式注入同事类呢? 这是因为同事类必须拥有中介者, 而中介者却可以只有部分同事类.
中介者模式的应用
中介者模式的优点:
减少了类间的依赖, 把原有的一对多的以来变成了一对一的依赖, 同事类只依赖中介者,减少了依赖,当然同时也降低了类间的耦合
中介者模式的缺点:
中介者会膨胀得很大,而且逻辑复杂, 原本N个对象直接的相互依赖关系转换成中介者和同事类的依赖关系, 同事类越多, 中介者的逻辑就越复杂.
中介者模式的使用场景:
中介者模式适用于多个对象之间紧密耦合的情况, 紧密耦合的标准是: 在类图中出现了蜘蛛网状结构. 在这种情况下一定要考虑使用中介者模式, 这有利于把蜘蛛网梳理为星型结构,使原本复杂混乱的关系变得清晰简单
中介者模式的实际应用
中介者模式也叫调停者模式, 什么意思呢? 一个对象要和N多个对象交流, 就像对象间的战争, 很混乱. 这时需要加入一个中心, 所有的类都和中心交流, 中心说怎么处理就怎么处理.举一些常见的例子:
1.机场调度中心.
在每个机场都会看到有一个"XX机场调度中心", 他就是具体的中介者, 用来调度每一架要降落和起飞的飞机.如果没有机场调度中心, 飞机飞到机场了, 飞行员要先看看有没有飞机和自己一起降落, 有没有空跑道灯,这是在难以想象.
2.MVC框架
MVC框架其中的 C(Controller)就是一个中介者, 叫做前端控制器, 它的作用就是把M(Model, 业务逻辑)和V(View, 视图)隔离开,协调M和V协同工作, 把M运行的结果和V代表的视图融合成一个前端可以展示的页面,减少M和V的依赖关系.
3.媒体网关
媒体网关也是一个典型的中介者模式, 比如使用MSN时,张三发消息给李四, 其过程应该是这样的: 张三发送消息, MSN服务器(中介者)接收到消息, 查找李四,把消息发送到李四, 同时通知张三, 消息已经发送. 在这里, MSN服务器就是一个中转站, 负责协调两个客户端的信息交流.
4.中介服务
现在中介服务非常多, 如租房中介等, 这些也是中介模式的具体体现.
中介者模式很少用到接口或者抽象类, 这与依赖倒置原则是冲突的, 这是为什么呢? 首先, 既然是同事类而不是兄弟类(有相同的血缘), 那就说明这些类之间是协作关系, 完成不同的任务, 处理不同的业务, 所以不能在抽象类或接口中严格定义同事类必须具有的方法(从这点也可以看出继承是高侵入性的).
一个 中介者抽象类一般只有一个实现类, 除非中介者逻辑非常复杂, 代码量非常大,这时才会出现多个中介者的情况. 对于中介者来说,抽象已经没有太多的必要.
中介者模式也不要滥用, 可以在如下情况下尝试使用中介者模式:
- N个对象之间产生了相互的依赖关系(N>2)
- 多个对象有依赖关系, 但是依赖的行为尚不确定或者有发生改变的可能, 在这种 情况下一般建议采用中介者模式,降低变更引起的风险扩散
- 产品开发. 一个明显的例子就是MVC框架, 把中介者模式应用到产品中, 可以提升产品的性能和扩展性,但是对于项目开发就未必, 因为项目是以交付投产为目标,而产品是以稳定、高效、扩展为宗旨.
23种设计模式之中介者模式相关推荐
- 【23种设计模式】中介者模式(Mediator Pattern) .Net Core实现
文章目录 简介 伪代码演示 简单实现 使用MediatR实现中介者模式 来源 简介 中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性.这种模式提供了一个中介类,该类 ...
- 23种设计模式之中介者模式(Mediator)
文章目录 概述 中介者模式的优缺点 中介者模式的使用场景 中介者模式的结构和实现 模式结构 模式实现 总结 概述 用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合 ...
- 【Unity3D与23种设计模式】中介者模式(Mediator)
GoF中定义: 定义一个接口来封装一群对象的互动行为 中介者通过移除对象之间的引用 以减少他们之间的耦合度 并且能改变它们之间的互动独立性 游戏做的越大,系统划分的也就越多 如事件系统,关卡系统,信息 ...
- 备战面试日记(3.3) - (设计模式.23种设计模式之结构型模式)
本人本科毕业,21届毕业生,一年工作经验,简历专业技能如下,现根据简历,并根据所学知识复习准备面试. 记录日期:2022.1.9 大部分知识点只做大致介绍,具体内容根据推荐博文链接进行详细复习. 文章 ...
- 备战面试日记(3.2) - (设计模式.23种设计模式之创建型模式)
本人本科毕业,21届毕业生,一年工作经验,简历专业技能如下,现根据简历,并根据所学知识复习准备面试. 记录日期:2022.1.6 大部分知识点只做大致介绍,具体内容根据推荐博文链接进行详细复习. 文章 ...
- 备战面试日记(3.4) - (设计模式.23种设计模式之行为型模式)
本人本科毕业,21届毕业生,一年工作经验,简历专业技能如下,现根据简历,并根据所学知识复习准备面试. 记录日期:2022.1.12 大部分知识点只做大致介绍,具体内容根据推荐博文链接进行详细复习. 文 ...
- 走穿java23种设计模式--18中介者模式详解
走穿java23种设计模式–18中介者模式详解 中介者模式也称调停者模式,是一种比较简单的模式. 一.中介者模式的现实场景 蔡良因为上次表白时对方只看重他的物质方面,所以他对女朋友这个问题有点失望.因 ...
- JAVA开发的23种设计模式之 — 装饰器模式 代理器模式
装饰器模式 概述 : 动态的给一个对象添加一些额外的职责,就增加功能来说,装饰器模式相比生成子类更加灵活 维基百科解释 : 通过使用修饰模式,可以在运行时扩充一个类的功能.原理是 :增加一个修饰类包裹 ...
- 23种设计模式之抽象工厂模式(Abstract Factory Pattern)
前言:大家好,我是小威,24届毕业生,在一家满意的公司实习.本篇文章将23种设计模式中的抽象工厂模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识. 如果文章有什么需要改进的地方还请 ...
最新文章
- mysql 字段扩容_解决DB2事物日志满、扩充表字段长度和表空间的命令
- Windows Workflow Beta2 HOL学习笔记(三):使用IfElse Activity,声明条件和自定义活动...
- python读取rar文件_在 python 中,如何读取由 7z 压缩的文本文件_python_酷徒编程知识库...
- MySql 中文乱码排查解决方案
- 2-hadoop-Hadoop以及生态
- Elasticsearch全量数据增量遍历实现原理
- excel 汇总 mysql_利用mysql收集excel录入汇总
- Ford-Fulkerson Edmonds-Karp算法
- C++第一次试水写cstring类
- kali linux mysql密码,Kali Linux中MySQL重置root密码
- JavaWeb之【web站点的欢迎页面】
- CF1463F Max Correct Set(取小样法+状压 DP)
- Lumen 安装配置
- 王雪松等:驾驶行为与驾驶风险国际研究进展
- STM32F4PWM详解
- 计算机网络期末复习:第一章概念
- mysql 1044 access denied
- 华为P50用鸿蒙系统吗,华为P50Pro+采用鸿蒙系统么-搭载鸿蒙OS么
- 数据中心暖通系统建设交付关键路径分析
- ftp客户端软件,3款值得推荐的ftp客户端软件
热门文章
- iPhone各版本屏幕尺寸
- centos7mysql语句创建表格_CentOS7中安装MySQL(简便)及 网站的搭建
- android studio占内存大小,极大精简android studio在C盘的内存
- 交换次数c语言,插入排序 - C中的比较和交换计数
- 怎么查看ingress的规则_有机合成中常见的基础理论规则
- cario java_Cairo图形库 概述
- problem a: 简单的整数排序_python里的排序
- c语言锁屏密码程序,求一个VB锁屏程序的源文件
- python打印长方形_利用python打印出菱形、三角形以及矩形的方法实例
- linux设置历史命令保留数目限制,linux下修改history命令保存条数