在本教程中,我们将学习一种行为模式,该行为模式将促进彼此通信的多个对象之间的松散耦合。 Mediator设计模式背后的想法是拥有一个中心对象,该对象封装了一组对象之间的交互方式。

在调解器模式中,我们在称为调解器的单独类中提取不同类之间的所有关系。 这使我们能够在不影响整个系统的情况下对一个组件进行更改。

因此,我们拥有一个松散耦合的系统,它更易于扩展和维护。

UML表示形式:

我们可以借助以下UML图来表示调解器模式:

在这里,我们有:

  • 介体:定义同事之间进行交流的契约的接口或抽象
  • ConcreteMediator:实现调解员合同的类; 它了解所有同事及其相互交流。 同事之间的任何交流都只能通过调解员进行
  • 同事:代表我们系统组件的接口或抽象
  • ConcreteColleague:实现Colleague界面并愿意彼此交互的类

实施中介者模式:

让我们以一个航空交通控制系统为例。

每个航班都需要知道其着陆的可用跑道。 如果我们允许飞机之间相互通信以找到可用的跑道,则会导致混乱。 而是,有一个飞机交通控制室是一个好主意,它可以跟踪所有可用的跑道并将其分配给飞机。

让我们从定义AircraftMediatorAircraftTrafficControlRoom开始

public interface AircraftMediator {public void registerRunway(Runway runway);public String allotRunwayTo(Aircraft aircraft);    public void releaseRunwayOccupiedBy(Aircraft aircraft);
}public class AicraftTrafficControlRoom implements AircraftMediator {private LinkedList<Runway> availableRunways = new LinkedList<>(); private Map<Aircraft, Runway> aircraftRunwayMap = new HashMap<>();@Overridepublic void registerRunway(Runway runway) {this.availableRunways.add(runway);}@Overridepublic String allotRunwayTo(Aircraft aircraft) {Runway nextAvailbleRunway = null;if(!this.availableRunways.isEmpty()) {nextAvailbleRunway = this.availableRunways.removeFirst();this.aircraftRunwayMap.put(aircraft, runway);}return nextAvailbleRunway == null ? null : nextAvailbleRunway.getName();}@Overridepublic void releaseRunwayOccupiedBy(Aircraft aircraft) {if(this.aircraftRunwayMap.containsKey(aircraft)) {Runway runway = this.aircraftRunwayMap.remove(aircraft);this.availableRunways.add(runway); }}
}

空中交通管制室充当调解员,并跟踪所有可用跑道。 它负责分配和释放跑道。

定义同事:

现在,让我们定义我们的飞机,其实例将是同事:

public interface AircraftColleague {void startLanding();void finishLanding();
}public class Aircraft implements AircraftColleague {private AircraftMediator mediator;private String flightName;public Aircraft(AircraftMediator mediator, String flightName) {this.mediator = mediator;this.flightName = flightName;}@Overridepublic void startLanding() {String runway = this.mediator.allotRunwayTo(this);if(runway == null) {//informing passengersSystem.out.println("Due to traffic, there's a delay in landing of " + this.flightName );  } else {System.out.println("Currently landing " + this.flightName + " on " + runway);  }  }@Overridepublic void finishLanding() {System.out.println(this.flightName + "landed successfully");this.mediator.releaseRunwayOccupiedBy(this);}
}

测试我们的实施:

让我们看看它们如何一起工作:

// In our main method
Runway runwayA = new Runway("Runway A");AircraftMediator mediator = new AircraftTrafficControlRoom();
mediator.registerRunway(runwayA);AircraftColleague wrightFlight = new Aircraft(mediator, "Wright Flight");
AircraftColleague airbusA380 = new Aircraft(mediator, "Airbus A380"); wrightFlight.startLanding();
airbusA380.startLanding();
wrightFlight.finishLanding();

执行上述代码后,我们将得到以下输出:

Currently landing Wright Flight on Runway A
Due to traffic, there's a delay in landing of Airbus A380
Wright Flight landed successfully

如果我们再次尝试降落空中客车,则可以在跑道可用的情况下继续进行降落。

结论:

在本教程中,我们学习了如何实现中介模式。 当我们具有多个对象相互通信的系统时,将使用中介模式。 这种模式促进了松散的耦合,从而使系统更加灵活。

这种模式的常见应用是聊天或消息传递系统。 此外, Java Concurrency Executor的execute()方法利用了这种模式。

翻译自: https://www.javacodegeeks.com/2019/09/mediator-design-pattern-java.html

Java中的中介器设计模式相关推荐

  1. Java中的中介器设计模式-示例教程

    中介者模式是行为设计模式之一 ,因此它处理对象的行为. 中介器设计模式用于在系统中不同对象之间提供集中式通信介质. 根据GoF,中介者模式意图是: 通过封装不同对象集相互交互和通信的方式,允许松散耦合 ...

  2. java 设计模式 示例_Java中的中介器设计模式-示例教程

    java 设计模式 示例 中介者模式是行为设计模式之一 ,因此它处理对象的行为. 中介器设计模式用于在系统中不同对象之间提供集中式通信介质. 根据GoF,中介者模式意图是: 通过封装不同对象集相互交互 ...

  3. Java中的装饰器设计模式

    装饰器设计模式允许在运行时将附加职责或行为动态附加到对象. 它是一种结构模式,利用聚合来组合这些行为. 在本教程中,我们将学习实现装饰器模式. UML图: 让我们从装饰器模式的UML表示开始: Con ...

  4. java设计模式中不属于创建型模式_23种设计模式第二篇:java工厂模式定义:工厂模式是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式...

    23种设计模式第二篇:java工厂模式 定义: 工厂模式是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 工厂模式主要是为创建对象提供过渡接口, ...

  5. 笔记:Java中的单例设计模式

    之前接触过单例模式,当初不明白这样的设计用意,今天特地研究了下java中的单例设计模式的用处及用法. 单例模式:单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.一个类 ...

  6. java中的垃圾收集器_Java中的垃圾收集

    java中的垃圾收集器 Garbage collection in java is one of the advance topic. Java GC knowledge helps us in fi ...

  7. java设计模式之装饰模式_Java中的装饰器设计模式

    java设计模式之装饰模式 装饰器设计模式允许在运行时将附加职责或行为动态附加到对象. 它是一种结构模式,利用聚合来组合这些行为. 在本教程中,我们将学习实现装饰器模式. UML图: 让我们从装饰器模 ...

  8. java 设计模式 示例_Java示例中的装饰器设计模式

    java 设计模式 示例 Decorator design pattern is used to modify the functionality of an object at runtime. A ...

  9. Java中的静态代理设计模式

    AOP(Aspect Oriented Programmimg) 面向切面编程 核心:spring中的代理设计模式 1.静态代理设计模式 service 核心: 核心功能:一定要有的功能,没有的话业务 ...

最新文章

  1. boost::weak_from_raw相关的测试程序
  2. js-比较两个日期的大小
  3. php imagemagick 漏洞,ImageMagick漏洞(CVE-2016-3714)修复方案
  4. parallelstream启动的线程数_高并发与多线程网络学习笔记(三)线程组和线程池
  5. 网上的很多Android项目源码有用吗?Android开发注意的地方。
  6. Java-ReentrantLock-NonfairSync/FairSync
  7. Linux进程地址空间和虚拟内存
  8. Markdown箭头总汇
  9. windows7副本不是正版问题
  10. python MySQLdb 一个连接connection多个cursor
  11. 超赞~免费生成国庆风格微信头像API接口
  12. 互联网赚钱的逻辑是什么?
  13. 小米air2se耳机只有一边有声音怎么办_小米无线蓝牙耳机Air2 SE——性价比背后的妥协之作...
  14. 微信公众号开发:如何获取openId(最简单的方式)
  15. 【数学建模】灰色预测法
  16. PT100温度电阻转换器
  17. 信号、signal 函数、sigaction 函数
  18. python教程40G,从入门到精通免费领取
  19. 【C】编写一个函数,由实参传来一个字符串,统计此字符串中字母、数字、空格和其他字符的个数,在主函数中输入字符串以及输出上述的结果。
  20. Weex 300行代码开发一款简易的跑步App

热门文章

  1. AliOS Things v1.2.0新特性
  2. apache+jk+tomcat集群+session同步
  3. Web中的XHRHttpRequest
  4. nfs服务端服务停掉,导致的客户端访问挂载目录卡死的情况
  5. Xmodem恢复交换机IOS
  6. Cannot change version of project facet Dynamic Web Module to 2.5 问题的解决方法
  7. golang 传值 传引用 简介
  8. 性能监控工具 NewRelic 简介
  9. golang 发送get和post示例
  10. 网络连接错误 failed to handler mux client connection