中介者模式的定义

中介者模式, 当多个类彼此关联, 会增大耦合性, 这时各个模块通过中介者进行交流, 每个模块只负责自己的业务逻辑, 不属于自己的就丢给中介者, 降低耦合

定义: 用一个中介对象封装一系列的对象交互, 中介者使各对象不需要显示的相互作用,从而使其耦合松散,而且可以独立的改变他们之间的交互.

通用类图如下:

由以下几部分组成:

  1. AbstractMediator 抽象中介者: 抽象中介者角色定义统一的接口, 用于各同事角色之间的通信.
  2. Mediator 具体中介者: 具体中介者角色通过协调各同事角色实现协作行为,因此它必须依赖各个同事角色
  3. 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.中介服务

现在中介服务非常多, 如租房中介等, 这些也是中介模式的具体体现.


中介者模式很少用到接口或者抽象类, 这与依赖倒置原则是冲突的, 这是为什么呢? 首先, 既然是同事类而不是兄弟类(有相同的血缘), 那就说明这些类之间是协作关系, 完成不同的任务, 处理不同的业务, 所以不能在抽象类或接口中严格定义同事类必须具有的方法(从这点也可以看出继承是高侵入性的).

一个 中介者抽象类一般只有一个实现类, 除非中介者逻辑非常复杂, 代码量非常大,这时才会出现多个中介者的情况. 对于中介者来说,抽象已经没有太多的必要.

中介者模式也不要滥用, 可以在如下情况下尝试使用中介者模式:

  1. N个对象之间产生了相互的依赖关系(N>2)
  2. 多个对象有依赖关系, 但是依赖的行为尚不确定或者有发生改变的可能, 在这种 情况下一般建议采用中介者模式,降低变更引起的风险扩散
  3. 产品开发. 一个明显的例子就是MVC框架, 把中介者模式应用到产品中, 可以提升产品的性能和扩展性,但是对于项目开发就未必, 因为项目是以交付投产为目标,而产品是以稳定、高效、扩展为宗旨.

23种设计模式之中介者模式相关推荐

  1. 【23种设计模式】中介者模式(Mediator Pattern) .Net Core实现

    文章目录 简介 伪代码演示 简单实现 使用MediatR实现中介者模式 来源 简介 中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性.这种模式提供了一个中介类,该类 ...

  2. 23种设计模式之中介者模式(Mediator)

    文章目录 概述 中介者模式的优缺点 中介者模式的使用场景 中介者模式的结构和实现 模式结构 模式实现 总结 概述 用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合 ...

  3. 【Unity3D与23种设计模式】中介者模式(Mediator)

    GoF中定义: 定义一个接口来封装一群对象的互动行为 中介者通过移除对象之间的引用 以减少他们之间的耦合度 并且能改变它们之间的互动独立性 游戏做的越大,系统划分的也就越多 如事件系统,关卡系统,信息 ...

  4. 备战面试日记(3.3) - (设计模式.23种设计模式之结构型模式)

    本人本科毕业,21届毕业生,一年工作经验,简历专业技能如下,现根据简历,并根据所学知识复习准备面试. 记录日期:2022.1.9 大部分知识点只做大致介绍,具体内容根据推荐博文链接进行详细复习. 文章 ...

  5. 备战面试日记(3.2) - (设计模式.23种设计模式之创建型模式)

    本人本科毕业,21届毕业生,一年工作经验,简历专业技能如下,现根据简历,并根据所学知识复习准备面试. 记录日期:2022.1.6 大部分知识点只做大致介绍,具体内容根据推荐博文链接进行详细复习. 文章 ...

  6. 备战面试日记(3.4) - (设计模式.23种设计模式之行为型模式)

    本人本科毕业,21届毕业生,一年工作经验,简历专业技能如下,现根据简历,并根据所学知识复习准备面试. 记录日期:2022.1.12 大部分知识点只做大致介绍,具体内容根据推荐博文链接进行详细复习. 文 ...

  7. 走穿java23种设计模式--18中介者模式详解

    走穿java23种设计模式–18中介者模式详解 中介者模式也称调停者模式,是一种比较简单的模式. 一.中介者模式的现实场景 蔡良因为上次表白时对方只看重他的物质方面,所以他对女朋友这个问题有点失望.因 ...

  8. JAVA开发的23种设计模式之 —  装饰器模式 代理器模式

    装饰器模式 概述 : 动态的给一个对象添加一些额外的职责,就增加功能来说,装饰器模式相比生成子类更加灵活 维基百科解释 : 通过使用修饰模式,可以在运行时扩充一个类的功能.原理是 :增加一个修饰类包裹 ...

  9. 23种设计模式之抽象工厂模式(Abstract Factory Pattern)

    前言:大家好,我是小威,24届毕业生,在一家满意的公司实习.本篇文章将23种设计模式中的抽象工厂模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识. 如果文章有什么需要改进的地方还请 ...

最新文章

  1. mysql 字段扩容_解决DB2事物日志满、扩充表字段长度和表空间的命令
  2. Windows Workflow Beta2 HOL学习笔记(三):使用IfElse Activity,声明条件和自定义活动...
  3. python读取rar文件_在 python 中,如何读取由 7z 压缩的文本文件_python_酷徒编程知识库...
  4. MySql 中文乱码排查解决方案
  5. 2-hadoop-Hadoop以及生态
  6. Elasticsearch全量数据增量遍历实现原理
  7. excel 汇总 mysql_利用mysql收集excel录入汇总
  8. Ford-Fulkerson Edmonds-Karp算法
  9. C++第一次试水写cstring类
  10. kali linux mysql密码,Kali Linux中MySQL重置root密码
  11. JavaWeb之【web站点的欢迎页面】
  12. CF1463F Max Correct Set(取小样法+状压 DP)
  13. Lumen 安装配置
  14. 王雪松等:驾驶行为与驾驶风险国际研究进展
  15. STM32F4PWM详解
  16. 计算机网络期末复习:第一章概念
  17. mysql 1044 access denied
  18. 华为P50用鸿蒙系统吗,华为P50Pro+采用鸿蒙系统么-搭载鸿蒙OS么
  19. 数据中心暖通系统建设交付关键路径分析
  20. ftp客户端软件,3款值得推荐的ftp客户端软件

热门文章

  1. iPhone各版本屏幕尺寸
  2. centos7mysql语句创建表格_CentOS7中安装MySQL(简便)及 网站的搭建
  3. android studio占内存大小,极大精简android studio在C盘的内存
  4. 交换次数c语言,插入排序 - C中的比较和交换计数
  5. 怎么查看ingress的规则_有机合成中常见的基础理论规则
  6. cario java_Cairo图形库 概述
  7. problem a: 简单的整数排序_python里的排序
  8. c语言锁屏密码程序,求一个VB锁屏程序的源文件
  9. python打印长方形_利用python打印出菱形、三角形以及矩形的方法实例
  10. linux设置历史命令保留数目限制,linux下修改history命令保存条数