简介

中介者模式(Mediator Pattern),定义了一个中介对象来封装一系列对象之间的交互关系。中介者使各个对象之间不需要显式地相互引用,从而使耦合性降低,而且可以独立地改变它们之间的交互行为,属于行为型模式。
其主要的目的是用来降低多个对象和类之间的通信复杂性。

简单的来说就是提供一个平台。比如生活中我们经常用到的聊天软件QQ、微信群,或者是上网购物的网站淘宝、京东,又或者是房产中介。但是无论是QQ群,还是房产中介,他们都是充当一个中间平台的作用,我们可以直接通过这个平台得到我们想要的信息,避免了独自获取花费的成本。

角色

中介者模式主要由这四个角色组成, 抽象中介者(Mediator)、具体中介者(ConcreteMediator)、 抽象同事类(Colleague)和具体同事类(ConcreteColleague) 。

  • 抽象中介者(Mediator): 定义了同事对象到中介者对象之间的接口。
  • 具体中介者(ConcreteMediator): 实现抽象中介者的方法,它需要知道所有的具体同事类,同时需要从 具体的同事类那里接收信息,并且向具体的同事类发送信息。
  • 抽象同事类(Colleague): 定义了中介者对象的接口,它只知道中介者而不知道其他的同事对象。
  • 具体同事类(ConcreteColleague) : 每个具体同事类都只需要知道自己的行为即可,但是他们都需要认识中介者。

示例图如下:

代码

这里为了方便理解,我们使用一个简单的示例来加以说明。
xuwujing创建了一个Java的QQ群,并邀请了很多人进来,其中张三也加进来了,进群之后,大家开始互相打招呼进行交流。。。
那么我们便可以根据这个简单的例子来使用中介者模式进行开发。
首先依旧定义一个抽象的中介者,就是QQ群,可以进行交流;然后再定义一个抽象的同事类,可以谈话。
那么这个抽象类的代码如下:


interface QQqun {void exchange(Person person,String message);
}abstract class Person{protected String name;protected QQqun qun;  Person(String name,QQqun qun){this.name = name;this.qun = qun;}
}

定义好该抽象类之后,我们再来定义具体的同事类,也就是xuwujing和张三,可以进行交流。

那么代码如下:

class ZhangSan extends Person{ZhangSan(String name, QQqun qun) {super(name, qun);}void exchange(String message){qun.exchange(this,message);}void talk(String message){System.out.println(name +"说:" + message);}
}class XuWuJing extends Person{XuWuJing(String name, QQqun qun) {super(name, qun);}void exchange(String message){qun.exchange(this,message);}void talk(String message){System.out.println(name +"回应:" + message);}
}

最后再来定义具体中介者对象,这个QQ群的具体实现。
代码如下:

class JavaQQqun implements QQqun{private ZhangSan zs;private XuWuJing xwj;public ZhangSan getZs() {return zs;}public void setZs(ZhangSan zs) {this.zs = zs;}public XuWuJing getXwj() {return xwj;}public void setXwj(XuWuJing xwj) {this.xwj = xwj;}@Overridepublic void exchange(Person person, String message) {if(zs.equals(person)){zs.talk(message);}else if(xwj.equals(person)){xwj.talk(message);}}
}

最后再来进行测试,定义好交流平台以及需要交流的人员。
那么测试代码如下:


public static void main(String[] args) {JavaQQqun jq = new JavaQQqun();  ZhangSan zs = new ZhangSan("张三", jq);XuWuJing xwj = new XuWuJing("xuwujing", jq);jq.setZs(zs);jq.setXwj(xwj);      zs.exchange("大家好!我是张三!");xwj.exchange("欢迎你!张三!");}

输出结果:
张三说:大家好!我是张三
xuwujing回应:欢迎你!张三!

总结

中介者模式优点:
灵活性高,因为将同事类进行了解耦,使其不必有关联性;
降低了类的复杂度,将一对多转化成了一对一;

中介者模式缺点:
中介者使用过多,会使系统变得复杂难以维护;

使用场景:
通过一个中间类来封装多个类中的行为,而又不想生成太多的子类

注意事项:
若不明确各个类的职责,那么就不要进行使用!

和外观模式、代理模式比较
中介者模式和外观模式、代理模式比较类似,但是又有不同。
和外观模式比较,中介者模式中,同事类必须依赖与中介者,中介者也知道同事类;但是外观模式中,子系统是不需要知道外观类的存在,并且子系统是可以脱离外观模式的。
和代理模式,代理模式的核心就是代理作用,主要还是对原先的类进行扩展或增加控制,比如进行权限控制;而中介者模式主要目的是为了减少对象之前的耦合,也就是同事类直接相互独立,互不影响。

参考文章:https://www.cnblogs.com/xuwujing/p/9911997.html

Java 设计模式——中介者模式(行为型设计模式)相关推荐

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

    中介者模式 1.什么是中介者模式 2.中介者模式的角色 3.例子 3.1 项目结构 3.2 共同实体 3.3 抽象的中介者 3.4 抽象的被中介者 3.5 具体的中介者 3.6 具体的被中介者 3.7 ...

  2. 【设计模式】Java设计模式 - 中介者模式

    Java设计模式 - 中介者模式

  3. Python设计模式-中介者模式

    Python设计模式-中介者模式 代码基于3.5.2,代码如下; #coding:utf-8 #中介者模式class colleague():mediator = Nonedef __init__(s ...

  4. 设计模式中介者模式-备忘录模式-状态模式

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

  5. 备忘录模式 Memento 快照模式 标记Token模式 行为型 设计模式(二十二)

    备忘录模式 Memento 沿着脚印,走过你来时的路,回到原点. 苦海翻起爱恨 在世间难逃避命运 相亲竟不可接近 或我应该相信是缘份 一首<一生所爱>触动了多少人的心弦,一段五百年都没有结 ...

  6. 7. 星际争霸之php设计模式--中介者模式

    题记 ============================================================================== 本php设计模式专辑来源于博客(jy ...

  7. C++设计模式——中介者模式(mediator pattern)

    一.原理讲解 1.1意图 用一个中介对象来封装一系列的对象.中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 1.2应用场景 一组对象以定义良好但复杂的方式进行 ...

  8. 设计模式-中介者模式(Mediator Pattern)

    设计模式-中介者模式(Mediator Pattern) 文章目录 设计模式-中介者模式(Mediator Pattern) 一.定义 二.概念解释 三.场景 四.实现 1.类图 2.代码实现 五.总 ...

  9. Java设计模式--中介者模式

    1 Mediator Pattern 中介者模式 目的:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互: 实现:定义一个对 ...

最新文章

  1. 如何用智能有效感知城市?城市大脑三大AI产品来了
  2. Redis在windows下安装过程
  3. linux下载gcc yarm,修改Yarn的全局安装和缓存位置
  4. 【NOI OpenJudge】【1.4】编程基础之逻辑表达式与条件分支
  5. python模块--subprocess
  6. 拼接SQL文的测试方法
  7. lamp一键安装包不安装mysql_LAMP一键安装包-CentOS 5/6下自动编译安装Apache、MySQL、PHP...
  8. java单点登录解决方案_N多系统单点登录,实现、解决方案。四种解决方案
  9. Word里面文字怎么加边框
  10. 燕过留声:由 Activity 和 Fragment 的通信方法想到的【WIP】
  11. 大数据三篇论文—The Google File System中文版
  12. thinkphp 打开速度缓慢,大多由于数据库读取问题!解决方法
  13. 百面机器学习 之 逻辑回归
  14. PHP数据库分表查询
  15. 随机森林计算特征重要性推导
  16. WebAPP添加到iOS的桌面
  17. 每天一个IDA小技巧(二):基本代码转换
  18. XenDesktop 连接数据库报错
  19. Operator介绍
  20. 你为什么跳槽?真正原因找到了吗?

热门文章

  1. Docker系列:梦开始的地方(1)——Windows10环境下的Docker安装、更改镜像源和更改默认镜像容器存储地址
  2. Cloudberry Backup Server Edition 1TB Version
  3. 如何在xmd上运行java文件,Java学习笔记(一)
  4. 动态权限框架:PermissionsDispatcher
  5. layui checkbox 反选/全选/取消单个取消全选/全部选中勾上全选
  6. 0基础怎么学游戏建模?
  7. 我和一个“婊子”不能不说的……
  8. web前端--弹窗广告实现
  9. 计算正整数的阶乘math.factorial()
  10. 人工智能与我们的世界