一、什么是中介者模式

  中介这个词并不陌生,就是房屋中介的那个“中介”,就是中间人的意思。比如MVC模式,C(Controller控制器)是M(Model模型)和V(View视图)的中介者,在前后端交互时起到了中间人的作用。

  中介者模式(Mediator),用一个中介对象来封装一系列的对象交互。中介者使各个对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。UML结构图如下:

  其中,Mediator是抽象中介者,定义了同事对象到中介者对象的接口;Colleague是抽象同事类;ConcreteMediator是具体中介者对象,实现抽象类的方法,它需要知道所有具体同事类,并从具体同事接收消息,向具体同事对象发出命令;ConcreteColleague是具体同事类,每个具体同事只知道自己的行为,而不了解其它同事类的情况,但它们却都认识中介者对象。

  1. 抽象中介者

  抽象中介者角色定义统一的接口,用于各同事角色之间的通信。

1 public abstract class Mediator {
2
3     //抽象的发送消息方法
4     public abstract void send(String message, Colleague colleague);
5
6 }

  2. 抽象同事类

  每一个同事角色都知道中介者角色,而且与其它的同事角色通信的时候,一定要通过中介者角色协作。每个同事类的行为分两种:一种是同事本身行为,比如改变对象本身的状态,处理自己的行为等,这种行为叫做自发行为,与其它同事类或者中介者没有任何依赖;第二种是必须依赖中介者才能完成的行为,叫做依赖方法。

1 public abstract class Colleague {
2
3     protected Mediator mediator;
4
5     public Colleague(Mediator mediator) {
6         this.mediator = mediator;
7     }
8
9 }

  3. 具体中介者类

  具体中介者角色通过协调各同事角色实现协作行为,因此它必须依赖于各个同事角色。

 1 public class ConcreteMediator extends Mediator {
 2
 3     private ConcreteColleague1 colleague1;
 4     private ConcreteColleague2 colleague2;
 5
 6     public void setColleague1(ConcreteColleague1 colleague1) {
 7         this.colleague1 = colleague1;
 8     }
 9
10     public void setColleague2(ConcreteColleague2 colleague2) {
11         this.colleague2 = colleague2;
12     }
13
14     @Override
15     public void send(String message, Colleague colleague) {
16         if(colleague == colleague1) {
17             colleague2.notify(message);
18         } else {
19             colleague1.notify(message);
20         }
21     }
22
23 }

  4. 具体同事类

  这里以ConcreteColleague1为例,ConcreteColleague2不再赘述。

 1 public class ConcreteColleague1 extends Colleague {
 2
 3     public ConcreteColleague1(Mediator mediator) {
 4         super(mediator);
 5     }
 6
 7     public void send(String message) {
 8         mediator.send(message, this);
 9     }
10
11     public void notify(String message) {
12         System.out.println("同事1得到消息:" + message);
13     }
14
15 }

  5. Client客户端

  首先创建一个具体中介者对象,然后实例化两个具体同事类并与该中介者进行绑定,colleague1与colleague2通过中介者发送信息。

 1 public class Client {
 2
 3     public static void main(String[] args) {
 4         ConcreteMediator mediator = new ConcreteMediator();
 5
 6         ConcreteColleague1 colleague1 = new ConcreteColleague1(mediator);
 7         ConcreteColleague2 colleague2 = new ConcreteColleague2(mediator);
 8
 9         mediator.setColleague1(colleague1);
10         mediator.setColleague2(colleague2);
11
12         colleague1.send("Nice to meet u.");
13         colleague2.send("Nice to meet u too.");
14     }
15
16 }

  运行结果如下:
  

二、中介者模式的应用

  1. 何时使用

  • 多个类相互耦合,形成网状结构时

  2. 方法

  • 将网状结构分离为星型结构

  3. 优点

  • 减少类间依赖,降低了耦合
  • 符合迪米特原则

  4. 缺点

  • 中介者会膨胀的很大,而且逻辑复杂

  5. 使用场景

  • 系统中对象之间存在比较复杂的引用关系
  • 想通过一个中间类来封装多个类的行为,而又不想生成太多的子类

  6. 应用实例

  • 联合国/WTO作为中介者协调各个国家
  • 房屋中介/机场调度系统
  • MVC框架,其中C(Contorller控制器)是M(Model模型)和V(View视图)的中介者

  7. 注意事项

  • 不应当在职责混乱时使用

三、中介者模式的实现

  上面我们有提到,联合国作为一个由各国代表组成,用来维护国际和平与安全,解决国际间经济、社会、文化和人道主义性质的问题的角色,它就是一个调停者、中介者的角色,国与国直接完全完全可以通过“联合国”这个中介者来发生关系,而不用直接通信。

  下面就以联合国安理会作为中介者,了解一下中介者模式。UML图如下:

  1. 联合国机构

  抽象中介者。

1 public abstract class UnitedNations {
2
3     public abstract void declare(String message, Country country);
4
5 }

  2. 国家类

  抽象国家类,需声明中介者角色。

1 public class Country {
2
3     protected UnitedNations unitedNations;
4
5     public Country(UnitedNations unitedNations) {
6         this.unitedNations = unitedNations;
7     }
8
9 }

  3. 具体国家类

  具体国家类,继承了抽象国家类。这里以USA类为例,Iraq类不再赘述。

 1 public class USA extends Country {
 2
 3     public USA(UnitedNations unitedNations) {
 4         super(unitedNations);
 5     }
 6
 7     public void declare(String message) {
 8         unitedNations.declare(message, this);
 9     }
10
11     public void getMessage(String message) {
12         System.out.println("美国获得对方信息:" + message);
13     }
14
15 }

  4. 联合国安理会

  具体中介者角色,继承抽象中介者,重写其declare()方法,对不同国家发送不同信息。

 1 public class UnitedNationsSecurityCouncil extends UnitedNations {
 2
 3     private USA usa;
 4     private Iraq iraq;
 5
 6     public void setUsa(USA usa) {
 7         this.usa = usa;
 8     }
 9
10     public void setIraq(Iraq iraq) {
11         this.iraq = iraq;
12     }
13
14     @Override
15     public void declare(String message, Country country) {
16         if(country == usa) {
17             iraq.getMessage(message);
18         } else {
19             usa.getMessage(message);
20         }
21     }
22
23 }

  5. Client客户端

  实例化一个联合国安理会对象,两国通过联合国安理会进行对话。

 1 public class Client {
 2
 3     public static void main(String[] args) {
 4
 5         UnitedNationsSecurityCouncil UNSC = new UnitedNationsSecurityCouncil();
 6
 7         USA usa = new USA(UNSC);
 8         Iraq iraq = new Iraq(UNSC);
 9
10         UNSC.setUsa(usa);
11         UNSC.setIraq(iraq);
12
13         usa.declare("不准研制核武器");
14         iraq.declare("我们没有核武器");
15     }
16
17 }

  运行结果如下:

  

  源码地址:https://gitee.com/adamjiangwh/GoF

转载于:https://www.cnblogs.com/adamjwh/p/10959987.html

简说设计模式——中介者模式相关推荐

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

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

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

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

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

    Java设计模式 - 中介者模式

  4. 简说设计模式——抽象工厂模式

    一.什么是抽象工厂模式 抽象工厂模式其实就是多个工厂方法模式,比如前面工厂方法模式中,我们创建多个不同类型的数据库,有MySQL.SQLServer等等,就是用工厂方法模式来实现的,但此时我们只能实现 ...

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

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

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

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

  7. 大话设计模式—中介者模式

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

  8. [设计模式]中介者模式之Events消息传递实现

    这篇文章比较短,修改自 写给大家看的设计模式之中介者中的例子 中介者模式的定义和目的自不必说, 参考上文即可. 本文针对实现方式做一个补充. 中介者模式增加了一个第三方对象(中介者)来控制两个对象(同 ...

  9. C++设计模式-中介者模式

    目录 基本概念 代码与实例 基本概念 中介者模式(Mediator)用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显示的相互作用,从而使其耦合松散,而且可以独立的改变他们之间的关系. 下面 ...

最新文章

  1. Excel函数公式 (日期函数)
  2. Android音频系统之AudioPolicyService
  3. 龙蜥社区成立系统运维SIG,开源sysAK系统运维工具集
  4. 打开VM虚拟机,遇见问题“无法连接MKS:套接字连接次数太多;正在放弃。”
  5. Mysql和Hive之间通过Sqoop进行数据同步
  6. 【Java数据结构与算法】第八章 快速排序、归并排序和基数排序
  7. 关于Ajax工作原理
  8. 网络研讨会的邀请:SQL优化:你不是一个人在战斗
  9. win10计算机本地无法连接,Win10没有本地连接怎么办?
  10. 如何使用Highscore进行XRD物相分析?
  11. 阿里云企业邮箱用smtp发送邮件失败解决
  12. AlphaPose(RMPE)区域多人姿态估计理解
  13. 跟上Java8 - 日期和时间实用技巧,转自知乎王爵nice
  14. 计算机网络和现场总线的区别,现场总线系统的特点和组成
  15. java语言 三国杀张昌蒲严教计算器
  16. kazam录制视频在windows下无法播放解决办法
  17. 写了个手机生成幻影坦克的APP——幻影坦克工厂
  18. 【引语练习题】Ask questions politely
  19. 继承 inherit
  20. IM开发者的零基础通信技术入门(二):通信交换技术的百年发展史(下)

热门文章

  1. PhotoShop JavaScript 入门
  2. Geant4 不完全学习指南9(粒子跟踪和物理过程)
  3. android 模拟crash_android 模拟屏幕点击
  4. 二、连接usg600
  5. LW9wZW5pbnN0YWxsLXBiLTEyMjUzMjY3Nzg0ODM2LQ==
  6. 江苏银行上半年净利增速创近4年最低,不良贷款156亿元
  7. 全民超神服务器维护,全民超神 - 服务退换中心 - 腾讯游戏
  8. 寺庙短视频流量及商业
  9. windows 下 IOCP模型(完成端口)
  10. 什么是色差仪?色差仪测试判断标准