引入

1.案例:

假设计算机1,2,3,4之间要相互通信。

2.面向实现编程方案:

类Computer1中要保存类Computer2、类Computer3和类Computer4实例,才能调用Computer2、Computer3、Computer4方法中的Comunicate方法。
。。。
。。。
。。。
具体图示如下:

3.面向设计编程方案:

建立一个中介者,保有类Computer1,类Computer2,类Computer3,类Computer4对象,每个Computer只需要跟中介者打交道,即可和其他的Computer通信。具体的图示如下:

明显可以看到面向设计的方案通过增加一层(中介层)可以明显较少类间的耦合。

一.名称

二.问题(为了解决什么问题)

中介者模式适合于多个对象之间紧密耦合的情况,紧密耦合的标准是:在类图中出现了蜘蛛网状结构。在这种情况下一定考虑使用中介者模式,这有利于把蜘蛛网树立成为星型结构,使原本复杂混乱的关系变得清晰简单。生活中常见的实例是:媒体网关、中介服务(如链家中介)等。

三.解决方案(主要体现在uml和核心代码上)

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

其实中介者模式是一个解耦框架,主要是通过增加一层(中介层)来实现类间的解耦。

中介者模式体现的设计原则有:依赖倒置,开闭原则,迪米特法则,里氏替换原则。
抽象类与继承——依赖倒置
抽象类——开闭原则
降低耦合——迪米特法则
抽象类——里氏替换原则

如果对象之间的联系呈现为网状结构,存在大量的多对多联系,在网状结构中,几乎每个对象都需要与其他对象发生相互作用,而这种相互作用表现为一个对象与另外一个对象的直接耦合,这将导致一个过度耦合的系统。如果在一个系统中对象之间存在多对多的相互关系,我们可以将对象之间的一些交互行为从各个对象中分离出来,并集中封装在一个中介者对象中,并由该中介者进行统一协调,这样对象之间多对多的复杂关系就转化为相对简单的一对多关系。通过引入中介者来简化对象之间的复杂交互,中介者模式是“迪米特法则”的一个典型应用。

类图

时序图

其实状态模式的Context就像一个中介者,避免了各种state之间的交互,二把交互交给Context来处理。

四.例子

求租者 - 房屋出租中介 - 房东 的故事
同事类:

/*** Created by annuoaichengzhang on 16/4/4.* 求租者-房屋出租中介-房东*/
public abstract class Person {protected Mediator mediator;protected String name;public Person(Mediator mediator, String name) {this.mediator = mediator;this.name = name;}public void setMediator(Mediator mediator) {this.mediator = mediator;}protected abstract void sendMessage(String msg);protected abstract void getMessage(String msg);
}
/*** Created by annuoaichengzhang on 16/4/4.*/
public class LandLord extends Person {public LandLord(Mediator mediator, String name) {super(mediator, name);}@Overrideprotected void sendMessage(String msg) {mediator.operation(this, msg);}@Overrideprotected void getMessage(String msg) {System.out.println("房东" + super.name + "收到中介发来的消息:" + msg);}
}
/*** Created by annuoaichengzhang on 16/4/4.*/
public class Renter extends Person {public Renter(Mediator mediator, String name) {super(mediator, name);}@Overrideprotected void sendMessage(String msg) {super.mediator.operation(this, msg);}@Overrideprotected void getMessage(String msg) {System.out.println("求租者" + super.name + "收到中介发来的信息" + msg);}
}

中介者:


/*** Created by annuoaichengzhang on 16/4/4.*/
public abstract class Mediator {protected List<Person> landlordList = new ArrayList<>();protected List<Person> renterList = new ArrayList<>();public void registerLandlord(Person landLord) {landlordList.add(landLord);}public void registerRenter(Person renter){renterList.add(renter);}public abstract void operation(Person person, String message);
}
/*** Created by annuoaichengzhang on 16/4/4.*/
public class HouseMediator extends Mediator {@Overridepublic void operation(Person person, String message) {// 如果是租房者,就把租房者的需求信息传递给注册了的房东们if (person instanceof Renter) {for (Person landlord : landlordList) {landlord.getMessage(message);}} else if (person instanceof LandLord) {// 如果是房东,就把房东的出租消息传递给注册了的求租者for (Person renter : renterList) {renter.getMessage(message);}}}
}

client:

/*** Created by annuoaichengzhang on 16/4/4.*/
public class Client {public static void main(String[] args) {Mediator mediator = new HouseMediator();Person landlordA, landlordB, renter;landlordA = new LandLord(mediator, "房东a");landlordB = new LandLord(mediator, "房东b");renter = new Renter(mediator, "小吕");mediator.registerLandlord(landlordA);mediator.registerLandlord(landlordB);mediator.registerRenter(renter);renter.sendMessage("想在四惠东附近租套一居室,加个1500");landlordA.sendMessage("在四惠东附近有一套两居室要出租,租金3000,联系电话0101010101001");}
}

运行结果:

房东房东a收到中介发来的消息:想在四惠东附近租套一居室,加个1500
房东房东b收到中介发来的消息:想在四惠东附近租套一居室,加个1500
求租者小吕收到中介发来的信息在四惠东附近有一套两居室要出租,租金3000,联系电话0101010101001
Process finished with exit code 0

五.效果(有啥优缺点)

优点:
1. 简化了对象间的交互

缺点:
1. 在具体的中介类中包含了大量同事之间的交互细节,会导致中介类非常复杂,不易维护。

常见案例

qq群群聊

图形界面类库。该类库包含若干预定义的窗格对象,例如textpane、listpane等,窗格之间不允许直接引用。基于该类库的应用由一个包含一组窗格的窗口组成,窗口需要协调窗格之间的行为。

设计模式系列:中介者模式相关推荐

  1. 设计模式系列 — 中介者模式

    点赞再看,养成习惯,公众号搜一搜[一角钱技术]关注更多原创技术文章. 本文 GitHub org_hejianhui/JavaStudy 已收录,有我的系列文章. 前言 23种设计模式速记 单例(si ...

  2. 设计模式(中介者模式-对象去耦)

    声明:本系列文章内容摘自<iOS设计模式> 中介者模式 用一个对象来封装一系列对象的交互方式.中介者使个对象不需要显式地相互调用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 何时 ...

  3. 设计模式系列·抽象工厂模式

    前言 以小说的笔法写的设计模式系列文章,你绝对看得懂![首发于公众号:"聊聊代码"] 设计模式系列·王小二需求历险记(一) 设计模式系列·王小二需求历险记(二) 设计模式系列·封装 ...

  4. 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern)

    [索引页] [源码下载] 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) 作者:webabcd 介绍 用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互 ...

  5. Java设计模式之中介者模式(UML类图分析+代码详解)

    大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...

  6. Java设计模式系列--责任链模式(应用)

    原文网址:Java设计模式系列--责任链模式(应用)_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍Java设计模式中的责任链模式的一些使用场景. 责任链模式的好处 符合单一职责原则 每个功能 ...

  7. 软件设计模式之中介者模式实验

    软件设计模式之中介者模式实验 一.实验目的 掌握软件设计模式中的中介者模式,能够用中介者模式编写程序,解决实际问题. 二.实验内容与要求 内容:有个租房中介为房主和租赁人提供租房服务,请用中介者模式对 ...

  8. 设计模式系列之建造者模式构建实体类

    设计模式系列之建造者模式(Build Pattern)构建实体类 模式定义 建造者模式属于23种设计模式中的创建型模式,可以理解为创建对象的一种很好的方法. 所谓建造者模式就是**将组件和组件的组件过 ...

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

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

  10. [设计模式] 17 中介者模式 Mediator Pattern

    在GOF的<设计模式:可复用面向对象软件的基础>一书中对中介者模式是这样说的:用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变 ...

最新文章

  1. 关于学习Python的一点学习总结(25->pass占位符)
  2. 深度学习框架的介绍与比较(Caffe, TensorFlow, MXNet, Torch, Theano)
  3. abb机器人指令手册_ABB机器人编程之程序流程指令(含案例)
  4. web页面实现地图展示,可缩放,标点并点击---使用高德地图
  5. 决定局域网的主要技术要素
  6. BufferedReader和BufferedWriter读写文件
  7. 3.9 YOLO算法-深度学习第四课《卷积神经网络》-Stanford吴恩达教授
  8. 关于ADB 执行报错问题-db server version (31) doesn't match this client (40); killing...
  9. Linux SSH命令使用大全
  10. leetcode面试题 04.02. 最小高度树(深度优先搜索)
  11. jsp内置对象--session
  12. springboot api文档_SpringCloud/SpringBoot - 自动生成API文档
  13. C++STL笔记(八):set和multiset详解
  14. 110+优秀作品、20+热门领域曝光, 高通如何玩转“AI 的夏天”!
  15. boot spring 跨域注解_每日一问学技术:@SpringBootApplication注解干了个啥?
  16. Ubuntu server配置远程VNC服务
  17. 22.1-在散列集上进行集合操作
  18. 免费的Access数据库员工管理系统下载-IT技术网站 企业人员管理系统源码
  19. 43张图详解计算机网络,看这一篇就够了
  20. qt调用vc编写库文件的方法

热门文章

  1. 如何分辨市面上的真假HDMI光纤线?
  2. Visio2013 取消箭头的自动连接
  3. 数字内容产业的政策背景与发展现状
  4. IDM下载器最新稳定版本6.33.2
  5. Jdbc系列八:批量处理
  6. WEB API新增整理(三)
  7. 人生路上对我影响最大的老师
  8. Android微信支付订单支付失败的问题
  9. 星环科技数据安全管理平台 Defensor重磅发布
  10. Python StringIO与cStringIO