1.定义

中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。中介者模式属于行为型模式。
简单来说:用一个中介对象来封装一系列的对象的交互。中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

2.概述

一个对象含有另一个对象的引用是面向对象中经常使用的方式,也是面向对象锁提倡的,即少用继承多用组合。
但是,对于某些特殊系统,特别是涉及很多对象时,该系统可能不希望这些对象直接交互,即不希望这些对象之间互相包含对方的引用,其原因是不利于系统今后的维护,扩展以及对象的复用。

3.应用场景

1、系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象。
2、想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。

4.模式的结构与使用

中介者模式的结构中包括四种角色
1.中介者(Mediator):中介者是一个接口,该接口定义了用于同事(Colleague)对象之间进行通信的方法;
2.具体中介者(ConcreteMediator):具体中介者是实现中介者接口的类。具体中介者需要包含所有具体同事(ConcreteColleague)的引用,并通过实现中介者接口中的方法来满足具体同事之间的通信要求;
3.同事(Colleague):一个接口,规定了具体同事需要实现的方法;
4.具体同事(ConcreteColleague):实现了同事接口的类。具体同事需要包含具体中介者的引用,一个具体同事需要和其他具体同事交互时,只需将自己的请求通知给它所包含的具体中介者的引用。

1.中介者模式的UML类图

2.结构的描述

以下通过一个简单的问题来描述中介者模式中所涉及的各个角色。
古代相互交战的A,B,C三方,想通过一个中介者调停之间的战火。A方委托调停者转达的信息是:“要求B方归还曾经抢夺的100斤土豆,要求C方归还曾经抢夺的20头牛”;B方委托调停者转达的信息是:“要求A方归还曾经抢夺的10只公鸡,要求C方归还曾经抢夺的15匹马”;C方委托调停者转达的信息是:“要求A方归还曾经抢夺的300斤小麦,要求B方归还曾经抢夺的50头驴”。
针对以上问题,使用中介者模式设计若干个类。
1.同事(Colleague)
本问题中,同时接口是Colleague,定义了具体同事,即交战各方需要实现的方法,包括giveMess发送消息,receiveMess接受消息,setName设置名称,getName获取名称等方法,具体代码如下所示:

package com.xing.mediator;public interface Colleague {public void giveMess(String[] mess);public void receiveMess(String mess);public void setName(String name);public String getName();
}

2.具体中介者(ConcreteMediator)
本问题中,只需要一个具体中介者,并不需要一个中介者(Mediator)接口,具体中介者是ConcreteMediator类,在里面包含了所有同事(Colleague)的引用,还包括deliverMess方法,即实现同事之间消息的传递,具体代码如下:

package com.xing.mediator;public class ConcreteMediator {ColleagueA colleagueA;ColleagueB colleagueB;ColleagueC colleagueC;public void registerColleagueA(ColleagueA colleagueA) {this.colleagueA = colleagueA;}public void registerColleagueB(ColleagueB colleagueB) {this.colleagueB = colleagueB;}public void registerColleagueC(ColleagueC colleagueC) {this.colleagueC = colleagueC;}public void deliverMess(Colleague colleague,String[] mess){if(colleague==colleagueA){if(mess.length>=2){colleagueB.receiveMess(colleague.getName()+mess[0]);colleagueC.receiveMess(colleague.getName()+mess[1]);}}else if(colleague==colleagueB){if(mess.length>=2){colleagueA.receiveMess(colleague.getName()+mess[0]);colleagueC.receiveMess(colleague.getName()+mess[1]);}}else if(colleague==colleagueC){if(mess.length>=2){colleagueA.receiveMess(colleague.getName()+mess[0]);colleagueB.receiveMess(colleague.getName()+mess[1]);}}}
}

3.具体同事(ConcreteColleague)
对应本问题,有ColleagueA,ColleagueB,ColleagueC三个具体同事,其实例分别表示交战的三方,具体代码如下所示:
ColleagueA.java

package com.xing.mediator;public class ColleagueA implements Colleague{ConcreteMediator mediator;//中介者String name;public ColleagueA(ConcreteMediator mediator) {this.mediator = mediator;mediator.registerColleagueA(this);}@Overridepublic void giveMess(String[] mess) {mediator.deliverMess(this,mess);}@Overridepublic void receiveMess(String mess) {System.out.println(name+"收到的信息:");System.out.println("\t"+mess);}@Overridepublic void setName(String name) {this.name=name;}@Overridepublic String getName() {return name;}
}

ColleagueB.java

package com.xing.mediator;public class ColleagueB implements Colleague{ConcreteMediator mediator;//中介者String name;public ColleagueB(ConcreteMediator mediator) {this.mediator = mediator;mediator.registerColleagueB(this);}@Overridepublic void giveMess(String[] mess) {mediator.deliverMess(this,mess);}@Overridepublic void receiveMess(String mess) {System.out.println(name+"收到的信息:");System.out.println("\t"+mess);}@Overridepublic void setName(String name) {this.name=name;}@Overridepublic String getName() {return name;}
}

ColleagueC.java

package com.xing.mediator;public class ColleagueC implements Colleague{ConcreteMediator mediator;//中介者String name;public ColleagueC(ConcreteMediator mediator) {this.mediator = mediator;mediator.registerColleagueC(this);}@Overridepublic void giveMess(String[] mess) {mediator.deliverMess(this,mess);}@Overridepublic void receiveMess(String mess) {System.out.println(name+"收到的信息:");System.out.println("\t"+mess);}@Overridepublic void setName(String name) {this.name=name;}@Overridepublic String getName() {return name;}
}

4.测试程序
Application.java

package com.xing.mediator;public class Application {public static void main(String[] args) {ConcreteMediator mediator=new ConcreteMediator();//定义中介者ColleagueA colleagueA=new ColleagueA(mediator);ColleagueB colleagueB=new ColleagueB(mediator);ColleagueC colleagueC=new ColleagueC(mediator);colleagueA.setName("A国");colleagueB.setName("B国");colleagueC.setName("C国");String[] messA={"要求归还曾经抢夺的100斤土豆","要求归还曾经抢夺的20头牛"};colleagueA.giveMess(messA);String[] messB={"要求归还曾经抢夺的10只公鸡","要求归还曾经抢夺的15匹马"};colleagueB.giveMess(messB);String[] messC={"要求归还曾经抢夺的300斤小麦","要求归还曾经抢夺的50头驴"};colleagueC.giveMess(messC);}
}

5.测试结果展示

5.中介者模式的优点

1、降低了类的复杂度,将一对多转化成了一对一。
2、各个类之间的解耦。
3、符合迪米特原则。
4、可以避免许多的对象为了之间的通信而相互显示引用,否则,不仅系统难于维护,而且也使其他系统难以复用这些对象。

设计模式:(中介者模式)相关推荐

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

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

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

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

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

    Java设计模式 - 中介者模式

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

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

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

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

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

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

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

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

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

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

  9. 学习设计模式 - 中介者模式

    中介者模式 一丶定义 定义一个中介者对象, 封装一系列对象的交互关系, 使得各对象不必显示的相互引用, 从而使其耦合松散, 而且可以独立的改变它们的交互 二丶理解 各对象显式地持有对方引用, 用于对象 ...

  10. PHP设计模式——中介者模式

    声明:本系列博客参考资料<大话设计模式>,作者程杰. 中介者模式用一个中介者对象来封装一系列的对象交互.中介者使得各对象不需要显式地相互引用,从而使其松散耦合,而且可以独立地改变它们之间的 ...

最新文章

  1. python输出个人信息_Python如何输出警告信息
  2. 虚拟化的发展历程和实现原理——图文详解
  3. 【转】C#委托事件浅析
  4. 数据库基础知识——DQL语言(二)
  5. FLV audio tag
  6. python基础编程练习题_Python随笔18:Python基础编程练习题1~2
  7. Keras Datasets 国内下载镜像
  8. 【Unity】制作简易三维场景
  9. 啊哈算法纸牌游戏———小猫钓鱼
  10. 伺服的电机转矩、功率、转速、电压、电流换算公式
  11. 自底向上与自顶向下(递归与动态规划)
  12. 鸿蒙形容欣欣向荣发展,形容发展超迅速的成语
  13. 常见电脑故障处理方法
  14. 计算多边形中心点坐标的方法
  15. Spring Cloud Gateway Session
  16. PHP内核之SAPI:Apache2 SAPI分析
  17. Java SE、Java ME、Java EE是什么以及关系
  18. Tomcat 部署方式
  19. 3Com Switch 4250T 系列交换机
  20. YOLOV8-gradcam 热力图可视化 即插即用 不需要对源码做任何修改!

热门文章

  1. EasyAR_实现AR涂涂乐
  2. CentOS + Mongodb 搭建NodeBB [转载翻译]
  3. 用IntelliJ IDEA自带的文本差异对比器
  4. lol手游账号服务器,英雄联盟手游
  5. 台湾省应广科技PMS150C纯IO PWM单片机MCU
  6. android 图片 色温,屏幕色温测试及测试结果
  7. 利用阿里云容器镜像服务下载gcr.io镜像
  8. 计算机DNS怎么配置,如何设置计算机dns?电脑dns设置教程
  9. linux c语言lzma,LZMA 算法简介
  10. Java-JFrame窗体美化