简介

中介者模式(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. Python 自带IDLE中调试程序
  2. 【Matlab】绘制3D 3维图
  3. Windows服务程序时钟调用
  4. swiper轮播图插件
  5. Spring Boot中的测试
  6. 后端技术:Mybatis是如何解析配置文件的?
  7. java图片转换为数据流_OpenCV 读取数据流图片
  8. SqlSession介绍
  9. a letter and a number
  10. BZOJ2134 单选错位
  11. 图书馆数据可视化大屏制作教程
  12. 微信又悄悄更新了,快看看你的微信表情发生了哪些变化
  13. 源自神话的写作要义之英雄之旅
  14. OneDrive,在云端
  15. (论文解读)High-frequency Component Helps Explain the Generalization of Convolutional Neural Networks
  16. java8实战:使用流收集数据之toList、joining、groupBy(多字段分组)(1)
  17. 深度学习day01-深度学习环境、conda、创建第一张画布
  18. 具体如何使用STAR结构化思维
  19. ajax提交时页面转圈,jquery的ajax提交时loading提示的处理方法
  20. JS中的分支语句和循环语句

热门文章

  1. VPS是干嘛用的?有哪些知名牌子?与云服务器有什么区别?
  2. Adobe CS3提示“安装数据库损坏”无法安装的解决方案
  3. 工作的态度和做事还是需要端正啊和注意啊
  4. 记 · H2-2光猫telnet破解超管密码
  5. 小型教育网站的开发与建设-总体设计(三)
  6. canvas画板涂鸦动画进度条动画
  7. 蓝桥杯算法训练——未名湖边的烦恼 (递归)
  8. ansible-基础-01
  9. 【pwnable.kr】leg
  10. 2018ACM暑期多校联合训练参(bao)赛(zha)记