前方高能《一故事一设计模式》PDF 电子书已经上线,关注公众号即可获取。

LieBrother公众号原文
行为型模式:中介者模式

十一大行为型模式之二:中介者模式。

简介

姓名 :中介者模式

英文名 :Mediator Pattern

价值观 :让你体验中介是无所不能的存在

个人介绍

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.
用一个中介对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
(来自《设计模式之禅》)

你要的故事

看了这小伙子的名字,大家会很直观的想到那些拿了我们半个月租的租房中介同学。在这不讲讲房租中介同学,以后可没机会了。大家现在找房子,不管是买还是租,一登录什么安居客、58同城,是不是有 80% 是经纪人房源,说 80% 还是比较保守的,经历了 4 次找房,发现个人房源越来越少。每个网站都有个选项:经纪人房源。如下图:

(图片截自:安居客网站)

经纪人就扮演着中介的角色,和本文要讲的中介者模式完全吻合。我们在找房子的时候,经纪人扮演什么角色呢?我们通过个人房源和经纪人房源的租房案例来简单描述经纪人的角色。

个人房源

我们通过个人房源找房子的方式是这样的:在网上找个人房源的房东,然后挨个联系,和房东约定好时间去看房,我们跟房东的关系是一对多的关系。小明就在网上看了个人房源,联系了房东,分别去看了农民房和小区房,用代码表示如下。

public class PersonalTest {public static void main(String[] args) {Tenant xiaoMing = new Tenant("小明");xiaoMing.lookAtHouse();}}class Tenant {private String name;private XiaoQuFangLandlord xiaoQuFangLandlord2 = new XiaoQuFangLandlord();private NongMinFangLandlord nongMinFangLandlord2 = new NongMinFangLandlord();public Tenant(String name) {this.name = name;}public void lookAtHouse() {System.out.println(this.name +"想看农民房");nongMinFangLandlord2.supply();System.out.println(this.name + "想看小区房");xiaoQuFangLandlord2.supply();}}/*** 房东*/
abstract class Landlord {// 提供房子public abstract void supply();
}class XiaoQuFangLandlord extends Landlord {@Overridepublic void supply() {System.out.println("小区房的房东提供一间小区房");}
}class NongMinFangLandlord extends Landlord {@Overridepublic void supply() {System.out.println("农民房的房东提供一间小区房");}
}打印结果如下:
小明想看农民房
农民房的房东提供一间小区房
小明想看小区房
小区房的房东提供一间小区房

小明分别联系小区房的房东和农民房的房东,然后依次去看了农民房和小区房。这样子有个弊端就是小明和房东是强关联的关系,其实小明只是去看一下房,看完不想租就和房东没啥关系了。这个时候经纪人就派上用场了,经纪人的主要任务就是把房子租出去,所以他和房东应该是强关系,直到把房子成功租出去了,才和房东脱离关系,而小明也不用去挨个找房东看房子了,这个职责转给经纪人,小明只需要联系一个人,那就是经纪人,跟他说我要看小区房和农民房,经纪人就带他去看。下面就介绍经纪人房源的方式,也就是本文要讲的中介者模式。

经纪人房源

用经纪人房源找房子,小明就省心很多了,小明就只联系了一个经纪人,跟他描述了自己要的房源:小区房和农民房都可以,经纪人里面和他约定了一个下午的时间,把小明所有想看的房让他看完,最终小明决定租了一间房。看代码。

public class MediatorTest {public static void main(String[] args) {System.out.println("小明想要看小区房和农民房");Tenant2 xiaoMing = new Tenant2("小明", Arrays.asList("XiaoQuFang", "NongMinFang"));xiaoMing.lookAtHouse();}}/*** 租客*/
class Tenant2 {private String name;private List<String> wantTypes;private RentingMediator rentingMediator = new RentingMediator();public Tenant2(String name, List<String> wantTypes) {this.name = name;this.wantTypes = wantTypes;}public void lookAtHouse() {rentingMediator.supplyHouse(wantTypes);}}/*** 中介抽象类*/
abstract class Mediator {// 看房public abstract void supplyHouse(List<String> types);
}/*** 租房中介*/
class RentingMediator extends Mediator {private XiaoQuFangLandlord xiaoQuFangLandlord;private NongMinFangLandlord nongMinFangLandlord;public RentingMediator() {xiaoQuFangLandlord = new XiaoQuFangLandlord();nongMinFangLandlord = new NongMinFangLandlord();}@Overridepublic void supplyHouse(List<String> types) {System.out.println("经纪人提供了如下房源");if (types.contains("XiaoQuFang")) {xiaoQuFangLandlord.supply();}if (types.contains("NongMinFang")) {nongMinFangLandlord.supply();}}
}打印结果:
小明想要看小区房和农民房
经纪人提供了如下房源
小区房的房东提供一间小区房
农民房的房东提供一间小区房

在代码中,我们可以看到小明和经纪人是一对一关系,经纪人和房东是一对多关系。小明找房经历也轻松多了,只花了一下午就把房子都看了并看中了。这也是中介者模式的优点,减少了不必要的依赖,降低了类间的耦合

代码:
Mediator Pattern

总结

中介者模式通过在互相依赖的对象中间加了一层,让原本强依赖的对象变成弱依赖。在软件编程中,有一个中介者模式的典型的例子,就是 MVC 框架,也称三层架构,通过 Controller (控制层) 将 Model (业务逻辑层) 和 View (视图层) 的依赖给分离开,协调 Model 和 View 中的数据和界面交互工作。看看你工作中的代码,想想看有没有哪些对象之间的关系特紧密特混乱,考虑是不是可以通过中介者模式来把依赖关系剥离,让代码更清晰。

参考资料:《大话设计模式》、《设计模式之禅》

推荐阅读:

行为型模式:模板方法

公众号之设计模式系列文章

希望文章对您有所帮助,设计模式系列会持续更新,感兴趣的同学可以关注公众号:LieBrother,第一时间获取文章推送阅读,也可以一起交流,交个朋友。

行为型模式:中介者模式 1相关推荐

  1. 设计模式-行为型模式-中介者模式

    设计模式-行为型模式-中介者模式 行为型模式 划分类和对象的职责. 中介者模式 进销存管理,即采购,销售,库存. 其中类图 代码如下 public class Purchase {// 采购IBM电脑 ...

  2. Java设计模式之行为型:中介者模式

     前言: 在我们的生活中处处充斥着"中介者",比如你租房.买房.找工作.旅游等等可能都需要那些中介者的帮助,地球上国与国之间的关系异常复杂,会因为各种各样的利益关系来结成盟友或者敌 ...

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

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

  4. 设计模式 — 行为型模式 — 中介者模式

    目录 文章目录 目录 中介者模式 应用场景 代码示例 中介者模式 中介者模式,将其他对象之间的交互装在中介者对象中,达到松耦合.隐式引用.独立变化. 中介者模式与代理模式有相似之处.但是代理模式是结构 ...

  5. 《设计模式详解》行为型模式 - 中介者模式

    中介者模式 6.7 中介者模式 6.7.1 概述 6.7.2 结构 6.7.3 案例实现 6.7.4 优缺点 6.7.5 使用场景 完整的笔记目录:<设计模式详解>笔记目录,欢迎指点! 6 ...

  6. php中介模式,中介者模式(Mediator pattern)详解及PHP实现

    中介者模式是一种行为型模式,它包装了一系列对象相互作用的方式,使得这些对象不必相互明显作用,从而使它们可以松散偶合.当某些对象之间的作用发生改变时,不会立即影响其他的一些对象之间的作用,保证这些作用可 ...

  7. 安卓适配器类中怎么调用intent_设计模式:代理模式/中介者模式 / 桥接模式/适配器 - 七星望...

    模式某种角度上来讲就是对象组合.不要看他们都是对象组合就好像是一样的.模式的动机,意图,使用场合,组合方式,这些都是模式的一部分.其中细微的不同足以区分不同的模式. 行为模式的主要特点就是处理的是对象 ...

  8. 【设计模式】外观模式代理模式中介者模式的区别

    外观模式 个人理解: 子类继承外观类的所有属性方法,客户端只需要跟外观类进行交流,实现了对所有子类的封装. 没有使用外观类 如图: 应用外观类 如图: 代理模式 个人理解: 代理模式是将原类进行封装, ...

  9. Java23种设计模式——19.行为型模式之中介者模式

    Java中除去有设计原则之外,还有23中设计模式. 这些模式都是前辈们一点一点积累下来,一直在改进,一直在优化的,而这些设计模式可以解决一些特定的问题. 并且在这些模式中,可以说是将语言的使用体现的淋 ...

  10. 行为型设计模式之中介者模式

    中介者模式 中介者模式 应用场景 主要角色 优缺点 基本使用 创建抽象中介者 创建具体中介者 创建抽象同事类 创建具体同事类 客户端执行 中介者模式 中介者模式又称为调解者模式或调停者模式,属于行为型 ...

最新文章

  1. 30个java_java的30个目标
  2. “人机耦合”变成“人机大战” AI同传离成熟还有多远
  3. ContentType大全
  4. Spring 使用注解方式进行事物管理
  5. 基于Linux系统中进程调度分析
  6. 美团产品顾问马占凯:关于育儿,你需要知道的一切
  7. 为什么说多道程序概念得到了中断和通道技术的支持?
  8. mac 完全卸载android studio
  9. C语言二个多项式的加法poly add算法(附完整源码)
  10. tcpdump抓包分析具体解释
  11. 服务器性能发挥,浪潮服务器发挥性能优势,算力“焦虑”问题被解决
  12. Q96:过程纹理(Procedural Texture)(0)——概述
  13. 微软商店下载的python_Python 登录微软 Win10 应用商店
  14. 林子雨spark scala版编程小结
  15. c语言swtitch输入字母输出,郝斌 C语言笔记
  16. 电脑软件故障排除2014年2月16日[修正版]
  17. USB数据采集卡关于高电压数据采集提供的解决方案
  18. 英语3500词(四)workplace主题 (2022.1.16)
  19. 史上最全面聊天机器人总结(图灵、思知、小i、小微)
  20. Error mounting /dev/sda8 at /media/wxp/

热门文章

  1. python 读取内存_使用Python学习win32库进行内存读写
  2. python houdini_Houdini Python开发实战 课程笔记
  3. Unreal Engine(虚幻引擎)渲染 – 正确使用方法
  4. 问与答——我怎么这么悲催?
  5. 岭南师范学院计算机科学与技术专业如何,2018岭南师范学院专业排名及分数线 王牌专业有哪些...
  6. 测试底妆的软件,倒了半瓶粉底液测了十颗美妆蛋 终于找到最好用的啦
  7. 在Centos7上安装osp
  8. 解决OBS无法使用窗口捕获以及显示器捕获的问题
  9. 2021-2027全球与中国半导体封装基板(IC载板)市场现状及未来发展趋势
  10. 赛门铁克:软件是灵魂