一、概述

用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介对象用来封装对象之间的关系,各个对象可以不需要知道具体的信息通过中介者对象就可以实现相互通信。它减少了对象之间的互相关系,提供了系统可复用性,简化了系统的结构。各个对象不需要互相知道了解,他们只需要知道中介者对象即可,但是中介者对象就必须要知道所有的对象和他们之间的关联关系,正是因为这样就导致了中介者对象的结构过于复杂,承担了过多的职责,同时它也是整个系统的核心所在,它有问题将会导致整个系统的问题。所以如果在系统的设计过程中如果出现“多对多”的复杂关系群时,千万别急着使用中介者模式,而是要仔细思考是不是您设计的系统存在问题。

二、使用场景

1.一组对象以定义良好但是复杂的方式进行通信。产生的相互依赖关系结构混乱且难以理解。

2.一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象。

3.想定制一个分布在多个类中的行为,而又不想生成太多的子类。

三、参与者

1.Mediator 中介者定义一个接口用于与各同事(Colleague)对象通信。

2.ConcreteMediator 具体中介者通过协调各同事对象实现协作行为。 了解并维护它的各个同事。

3.Colleagueclass 每一个同事类都知道它的中介者对象。 每一个同事对象在需与其他的同事通信的时候,与它的中介者通信

四、类图

五、代码示例

1.Mediator

/**

* Mediator

* @author zhipeng_Tong

*/

public abstract class UnitedNations {

public abstract void declare(String message, Country country);

}

2.Colleague

/**

* Colleauge

* @author zhipeng_Tong

*/

public abstract class Country {

protected UnitedNations mediator;

public Country(UnitedNations unitedNations) {

this.mediator = unitedNations;

}

}

3.ConcreteMediator

/**

* ConcreteMediator

* @author zhipeng_Tong

*/

public class UnitedNationsSecurityConcil extends UnitedNations {

private USA usa;

private Iraq iraq;

public void setUsa(USA usa) {

this.usa = usa;

}

public void setIraq(Iraq iraq) {

this.iraq = iraq;

}

@Override

public void declare(String message, Country country) {

if (country == usa)

iraq.getMessage(message);

else

usa.getMessage(message);

}

}

4.ConcreteColleague

/**

* ConcreteColleauge

* @author zhipeng_Tong

*/

public class USA extends Country {

public USA(UnitedNations unitedNations) {

super(unitedNations);

}

// 发布消息

public void declare(String message) {

mediator.declare(message, this);

}

// 获得消息

public void getMessage(String message) {

System.out.println("美国获得对方的消息:" + message);

}

}

/**

* ConcreteColleauge

* @author zhipeng_Tong

*/

public class Iraq extends Country {

public Iraq(UnitedNations unitedNations) {

super(unitedNations);

}

// 发布消息

public void declare(String message) {

mediator.declare(message, this);

}

// 获得消息

public void getMessage(String message) {

System.out.println("伊拉克获得对方的消息:" + message);

}

}

5.测试代码

public class Client {

public static void main(String[] args) {

UnitedNationsSecurityConcil concil = new UnitedNationsSecurityConcil();

USA usa = new USA(concil);

Iraq iraq = new Iraq(concil);

concil.setUsa(usa);

concil.setIraq(iraq);

String usaSpeak = "不准研制核武器,否则发动战争。";

System.out.println(String.format("美国发送消息:%s", usaSpeak));

usa.declare(usaSpeak);

String iraqSpeak = "我们没有研制核武器,不怕你。。";

System.out.println(String.format("伊拉克发送消息:%s", iraqSpeak));

iraq.declare(iraqSpeak);

}

}

运行结果

美国发送消息:不准研制核武器,否则发动战争。

伊拉克获得对方的消息:不准研制核武器,否则发动战争。

伊拉克发送消息:我们没有研制核武器,不怕你。。

美国获得对方的消息:我们没有研制核武器,不怕你。。

java mediator_浅谈Java设计模式——中介者模式(Mediator)相关推荐

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

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

  2. 设计模式.中介者模式Mediator

    定义 中介者模式(Mediator pattern) : 使用中介者模式来集中相关对象之间复杂的沟通和控制方式,使得这些对象不必相互明显引用.从而使它们可以较松散地耦合.当这些对象中的某些对象之间的相 ...

  3. 【Java】浅谈Java的GUI开发

    GUI是什么? 图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面. 图形用户界面是一种人与计算机通信的界面显示格 ...

  4. java fork_浅谈Java的Fork/Join并发框架

    前几天有写到整合并发结果的文章,于是联想到了Fork/Join.因为在我看来整合并发结果其实就是Fork/Join中的Join步骤.所以今天我就把自己对Fork/Join一些浅显的理解记录下来. 1. ...

  5. 【Java】浅谈Java的I/O体系

    文章目录 流(Stream) 流的分类 java.io.* I/O体系的四大抽象类 流的分类总结表 流的层次结构图 字节输入流的层次结构图 字节输出流的层次结构图 字符输入流的层次结构图 字符输出流的 ...

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

    1.定义 中介者模式是一种行为型模式,是为了解决对象之间错综复杂的调用关系的一种设计模式,这种错综复杂的调用关系采用一个中介类来进行帮忙调用,所有的调用者只是需要关心中介者,而不需要进行互相依赖. 例 ...

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

    中介者模式 概述 用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 适用性 1.一组对象以定义良好但是复杂的方式进行通信. ...

  8. java mediator_关于Java 设计模式 中介者模式 Mediator

    1.Order.java package com.ssm.cts.pattern.mediator; public class Order { public void buyBar(int numbe ...

  9. java memento_浅谈Java设计模式——备忘录模式(Memento)

    一.概述 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态.它实现了对信息的封装,使得客户不需要关心状态保存的细节.保存就要消耗资源 ...

最新文章

  1. 计算机应用基础教材编写建议,【计算机应用论文】计算机应用基础校本教材编写研究(共3136字)...
  2. Hinton再挖新坑:改进胶囊网络,融合Transformer神经场等研究
  3. [原]软件设计的一些感悟
  4. pytorch生成一个数组
  5. XML Web Service 安全性
  6. python处理表格数据教程_用Python的pandas框架操作Excel文件中的数据教程
  7. 讯飞tts语音引擎9.0_使用科大讯飞语音转文字的服务进行电话录音分析
  8. Angular @NgModule providers里multi等于true在源代码里如何体现的
  9. 刷新本地的DNS缓存数据
  10. Burst Balloons
  11. 自定义右键菜单,禁用浏览器自带的右键菜单[右键菜单实现--Demo]
  12. Google Chrome 开发进度 官方Blog
  13. 客户关系管理系统中对客户及相关数据的导入导出分析处理
  14. webpack搭建react脚手架
  15. python中如何画出决策树_python画决策树
  16. 富爸爸系列全集图书清单
  17. python老王卖西瓜_搞不懂Python?大神教你用Python买西瓜!
  18. kotlin完成 Code War 题目 解析分子公式
  19. 大学计算机基础ppt操作题目,键盘操作大学计算机基础.ppt
  20. 3、乐趣国学—“色难”

热门文章

  1. 部署ELK+Kafka+Filebeat日志收集分析系统
  2. 电竞游戏耳机哪个好用?和平精英吃鸡耳机排行榜
  3. CentOS_6.5 x86_64 制作U盘启动方法
  4. 电脑横机初学者视频_初学者怪胎:如何将笔记本电脑连接到电视
  5. 光流直方图简化版HOF特征
  6. Cobbler原理与实战
  7. “Input”表示值,但在此处用作类型。是否指“类型 Input”?ts(2749)
  8. 《魔法黎明(Dawn of Magic)》修改存档魔法技能、工匠技能、属性点、金币数量(一)
  9. c语言实现简单的加减乘除运算---@颜麓
  10. edge浏览器无法登录账号!Microsoft 帐户无法登录!