背景

有这样一个场景,如果你有很多朋友,朋友与朋友之间也是朋友。如果你的QQ号码变化,你的所有朋友都需要知道,你会告诉你的朋友你的QQ号码变了,朋友再告诉他的朋友。这样所有的朋友都需要相互通知你的QQ号码变了,这样牵一发动全身,耦合性非常大。

网状结构

为了降低之间的耦合性,可以将网状结构改成星形模式。这里就需要一个中介者,负责告知所有的朋友。

星形结构

这种形式后面就发展成了中介者模式。

什么是中介者模式

Define an object that encapsulates how a set of objects interact.Mediator promotes loose coupling by keeping objects from referring to each other explicitly,and it lets you vary their interaction independently.(用一个中介对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使其耦合松散,而且可以独立地改变它们之间的交互。)

中介者模式中,有一个中介对象用来封装一系列的对象之间的交互,使原有的对象之间的耦合性更松散。

使用中介者模式可以使对像之间的一对多关系简化为一对一的关系,提高了系统的灵活性。

但是如果对象太多,会导致中介者逻辑更加复杂化,中介者的维护也需要一定的成本。

中介者模式主要由下面几个要素组成:

  • 抽象中介者(Mediator)角色:它是中介者的接口,提供了同事对象注册与转发同事对象信息的抽象方法。

  • 具体中介者(ConcreteMediator)角色:实现中介者接口,定义一个 List 来管理同事对象,协调各个同事角色之间的交互关系,因此它依赖于同事角色。

  • 抽象同事类(Colleague)角色:定义同事类的接口,保存中介者对象,提供同事对象交互的抽象方法,实现所有相互影响的同事类的公共功能。

  • 具体同事类(Concrete Colleague)角色:是抽象同事类的实现者,当需要与其他同事对象交互时,由中介者对象负责后续的交互。

组成元素

代码示例

我们按照上图的关系来写代码

Mediator

public abstract class Mediator {public abstract void register(Colleague colleague);public abstract void relay(Colleague cl); //转发
}

ConcreteMediator

Colleague

ConcreteColleague1

ConcreteColleague2同上。

我们来测试下:

测试结果:

具体同事类1发出请求。
具体同事类2收到请求。
------------
具体同事类2发出请求。
具体同事类1收到请求。

代码解释

首先我们创建一个具体中介者对象,具体同事对象1,具体同事对象2。然后执行:

md.register(c1);
md.register(c2);

这时List中会存入ConcreteColleague1ConcreteColleague2的对象。

然后执行:

c1.send()

send()方法内部打印【具体同事类1发出请求。】。然后执行中介者的转发方法:

mediator.relay(this);

这个方法会拿取List集合中除自身调用者的Colleague对象。然后执行除自身的所有对象的receive()方法。

同事与同事之间的通信交给了中介者去做了。

关于中介者模式的思考

我们什么时候需要使用中介者模式呢?

当多个对象之间出现紧密耦合的情况,紧密耦合的标准是:在类图中出现了蜘蛛网状结构。在这种情况下一定要考虑使用中介者模式,这有利于把蜘蛛网梳理为星型结构,使原本复杂混乱的关系变得清晰简单。

然而只用中介者模式也需要量力而行,就如文章同开头说的,使用中介者模式会使中介者类的代码逻辑更为复杂。所以在使用时需要有取舍。

其实我们常用的的MVC模型也是使用了中介者模式,其中的C(Controller)就是一个中介者,叫做前端控制器(Front Controller),它的作用就是把M(Model,业务逻辑)和V(View,视图)隔离开, 协调M和V协同工作,把M运行的结果和V代表的视图融合成一个前端可以展示的页面,减少 M和V的依赖关系。

往期推荐

  • 我写出这样干净的代码,老板直夸我

  • 云南丽江旅游攻略

  • 使用ThreadLocal怕内存泄漏?

  • Java进阶之路思维导图

  • 程序员必看书籍推荐

  • 3万字的Java后端面试总结(附PDF)

扫码二维码,获取更多精彩。或微信搜Lvshen_9,可后台回复获取资料

1.回复"java" 获取java电子书;2.回复"python"获取python电子书;3.回复"算法"获取算法电子书;4.回复"大数据"获取大数据电子书;5.回复"spring"获取SpringBoot的学习视频。6.回复"面试"获取一线大厂面试资料7.回复"进阶之路"获取Java进阶之路的思维导图8.回复"手册"获取阿里巴巴Java开发手册(嵩山终极版)9.回复"总结"获取Java后端面试经验总结PDF版10.回复"Redis"获取Redis命令手册,和Redis专项面试习题(PDF)11.回复"并发导图"获取Java并发编程思维导图(xmind终极版)

另:点击【我的福利】有更多惊喜哦。

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

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

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

  2. 《研磨设计模式》chap10 中介者模式Mediator(1)简介

    1. 使用场景 如果电脑没有主板,各个配件的关系为 有主板后: 2. 中介者模式简介:各对象通过中介者来交互 //Mediator.java public interface Mediator { p ...

  3. java mediator模式_设计模式之Mediator 中介者模式 - 解道Jdon

    设计模式目录 >> 当前页 设计模式之Mediator(中介者) 板桥里人 http://www.jdon.com 2002/05/05 Mediator中介者模式定义: 用一个中介对象来 ...

  4. 【Java开发】设计模式 17:中介者模式

    1 中介者模式介绍 中介者模式是一种行为设计模式,指用一个中介对象来封装一系列的对象交互. 中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互.在这个模式中,中介者 ...

  5. 设计模式学习笔记--中介者模式(详细笔记)

    文章目录 1. 概述 2. 使用实例 1. 概述 使用背景: 菜鸟教程 用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. ...

  6. 设计模式理解:中介者模式(Mediator)

    中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性.这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护. 两个类或者多个类之间存在相 ...

  7. Net设计模式实例之中介者模式(Mediator Pattern)

    一.中介者模式简介(Brief Introduction) 中介者模式(Mediator Pattern),定义一个中介对象来封装系列对象之间的交互.中介者使各个对象不需要显示地相互引用,从而使其耦合 ...

  8. 设计模式:(中介者模式)

    1.定义 中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性.这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护.中介者模式属于行为 ...

  9. java设计模式-观察者模式和中介者模式的异同

    1.基本定义区别: 观察者模式: :察者模式属于行为型模式,指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新.这种模式有时又称作发布-订阅模式.模 ...

最新文章

  1. Autodesk PowerInspect 2021中文版
  2. 整合分页pageHelper||整合分页pageHelper-starter不用做任何分页相关的配置
  3. Linux: 系统配置 crond 和 crontab(有图有代码有真相!!!)
  4. final、finally和finalize;throw和throws;collection和collections;==和equals;Statement和PrepareStatement...
  5. 假设以带头结点的循环链表表示队列_数据结构·链表(C实现)
  6. 利用第三方工具上传文件
  7. 免费讲座:从草根到巨人——互联网时代的LAMP开源架构
  8. PickerView
  9. 有一个Map集合里面存储的是学生的姓名和年龄,内容如下{赵四=21,王二=17,张三=18,小丫=25,李四=26,王五=38}(15分) * a.将里面的元素用两种遍历方式打印到控制台上 *
  10. cesium添加填充_项目中的一个关于cesium的边界线的问题
  11. Windows10 安装spyder3
  12. 基于WENET制作AI字幕
  13. C博客作业00--我的第一篇博客
  14. fx5u 脉冲输出指令PLSY(DPLSY)4种写法
  15. 对持续集成、 持续交付、持续部署和持续发布的介绍
  16. Unity实现加载文件夹内所有图片并可显示和放大的一种解决方案
  17. MATLAB 数据及基本运算 --持续更新
  18. QtSpeech会让Qt说话
  19. mallet java_Mallet:自然语言处理工具包
  20. 红队内网渗透神器--CobaltStrike安装教程

热门文章

  1. threejs 特效 更多特效相见
  2. Python官网主页改版 http://www.python.org/
  3. 综述 | 图像计算传感器
  4. Spring中Bean的生命周期以及三级缓存介绍
  5. 编译原理-第一章-引论
  6. Picgo的gitee图床简略设置及gitee图片仓库无法使用解决方案
  7. ubuntu-安装Wine
  8. Kali [Sqlmap]
  9. axios库读不到cookie_axios中cookie跨域及相关配置示例详解
  10. Java爬虫.HttpClient