介体设计模式示例

本文是我们名为“ Java设计模式 ”的学院课程的一部分。

在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因,并了解何时以及如何应用模式中的每一个。 在这里查看 !

目录

1.简介 2.什么是中介者模式 3.实施中介者模式 4.何时使用中介模式 5. JDK中的中介者模式 6.下载源代码

1.简介

当今世界在软件上运行。 现在,软件几乎可以在所有事物中运行,不仅可以在计算机中使用。 智能电视,移动电话,手表,洗衣机等具有用于操作机器的嵌入式软件。

一家大型电子公司要求您开发软件来操作其新的全自动洗衣机。 公司为您提供了硬件规格和机器的工作知识。 在规格中,他们为您提供了机器支持的不同洗涤程序。 他们想生产一种需要几乎0%的人机交互的全自动洗衣机。 用户只需要用水龙头连接机器即可供水,装载要洗涤的衣服,将机器的衣服类型设置为棉,丝绸或牛仔布等,在各自的托盘上提供洗涤剂和柔软剂,然后按开始按钮。

机器应足够智能,以根据需要将水倒入滚筒中。 它应根据衣物的类型通过打开加热器自行调节洗涤温度。 它应启动电动机并根据需要旋转滚筒,根据衣物需要冲洗,必要时使用去污剂,还应使用柔软剂。

作为面向对象的开发人员,您开始分析和分类对象,类及其关系。 让我们检查一些重要的类和系统的各个部分。 首先是Machine类,它有一个鼓。 鼓类,还有加热器,检查温度的传感器,电动机。 此外,机器还具有控制供水的阀,污垢清除剂,清洁剂和柔软剂。

这些类之间的关系非常复杂,并且关系也各不相同。 请注意,当前我们仅采用机器的高级抽象。 如果我们在设计时不考虑很多OOP原理和模式,那么初始设计将非常紧密地耦合在一起并且难以维护。 这是因为上述类应相互联系以完成工作。 例如,“机器”类应要求“阀门”类打开阀门,或者“电动机”应根据洗涤程序集(由机器中的衣物类型设置)以一定的rpm旋转滚筒。 某些类型的衣服需要柔软剂或去污剂,而其他类型则不需要,或者应根据衣服的类型设置温度。

如果我们允许类直接相互联系,也就是说,通过提供参考,设计将变得非常紧密并且难以维护。 在不影响另一个类别的情况下改变一个类别将变得非常困难。 更糟糕的是,根据不同的洗涤程序,类别之间的关系也有所不同,例如不同类型的衣服的温度不同。 因此,这些类将无法重用。 更糟糕的是,为了支持所有的清洗程序,我们需要在代码中放置诸如if-else之类的控制语句,这会使代码更加复杂且难以维护。

为了使这些对象彼此分离,我们需要一个介体,该介体将代表另一个对象接触该对象,从而在它们之间提供松散的耦合。 该对象仅需要了解介体,并对其执行操作。 中介者将对所需的基础对象执行操作,以完成工作。

中介者模式最适合于此,但是在实施它之前可以解决我们的问题。 首先让我们进一步了解介体设计模式。

2.什么是中介者模式

介体模式定义了一个对象,该对象封装了一组对象之间的交互方式。 介体通过防止对象之间显式地相互引用来促进松散耦合,并且它使您可以独立地更改它们之间的交互。

对象不是直接彼此交互,而是要求中介程序代表它们进行交互,这导致可重用性和松散耦合。 它封装了对象之间的交互并使它们彼此独立。 这使他们可以通过实现不同的介体以完全不同的方式改变与其他对象的交互。 介体有助于降低类的复杂性。 每个对象不再需要详细了解如何与其他对象交互。 对象之间的耦合从紧密和脆弱变为松散和敏捷。

在Mediator之前,类之间的交互可能看起来像这样,包含彼此的引用。

图1

图1

现在,实现介体后,类之间的交互看起来像这样,只包含对介体的引用。

图2

图2

只要您拥有紧密耦合的一组对象,介体设计模式就应该是您的首选。 如果一系列对象中的每个对象都必须了解其他对象的内部细节,并且维持这些关系成为问题,请考虑使用调解器。 使用调解器意味着交互代码只能驻留在一个地方,这使得维护更容易。 使用调解器可能会隐藏一个更严重的问题:如果多个对象紧密耦合,则封装可能有问题。 现在可能是重新考虑如何将程序分解为对象的时候了。

让我们看一下介体模式的更正式结构。

图3

图3

拥有调解员参考的班级称为同事。 调解员模式的主要参与者是:

  1. 介体:定义用于与同事对象进行通信的接口。
  2. ConcreteMediator:通过协调同事对象实现协作行为。 它还了解并维护其同事。
  3. 同事班:每个同事班都知道其Mediator对象。 只要有其他同事与之沟通,每个同事都会与其调解员进行沟通。

3.实施中介者模式

现在,我们将看到介体模式如何使洗衣机的设计更好,可重复使用,可维护且松耦合。

package com.javacodegeeks.patterns.mediatorpattern;public interface MachineMediator {public void start();public void wash();public void open();public void closed();public void on();public void off();public boolean checkTemperature(int temp);}

MachineMediator是充当通用介体的接口。 该接口包含一个对象调用到另一个对象的操作。

package com.javacodegeeks.patterns.mediatorpattern;public interface Colleague {public void setMediator(MachineMediator mediator);}

Colleague界面有一种为具体同事的班级设置调解员的方法。

package com.javacodegeeks.patterns.mediatorpattern;public class Button implements Colleague {private MachineMediator mediator;@Overridepublic void setMediator(MachineMediator mediator){this.mediator = mediator;}public void press(){System.out.println("Button pressed.");mediator.start();}}

上面的Button类是一个同事类,其中包含对调解器的引用。 用户按下按钮,该按钮调用此类的press()方法,该按钮又调用具体介体类的start()方法。 这start()调解的方法调用start()的机器类的代表的方法Button类。

稍后,我们将看到中介者类的结构。 但是现在让我们首先看看其余的同事课堂。

package com.javacodegeeks.patterns.mediatorpattern;public class Machine implements Colleague {private MachineMediator mediator;@Overridepublic void setMediator(MachineMediator mediator){this.mediator = mediator;}public void start(){mediator.open();}public void wash(){mediator.wash();}
}

上面保留对中介程序的引用的Machine类具有start()方法,如上所述,该按钮由中介程序类在按下按钮时调用。 该方法具有介体的open()方法,该介体又调用Valve类的open()方法以打开机器的阀门。

package com.javacodegeeks.patterns.mediatorpattern;public class Valve implements Colleague {private MachineMediator mediator;@Overridepublic void setMediator(MachineMediator mediator){this.mediator = mediator;}public void open(){System.out.println("Valve is opened...");System.out.println("Filling water...");mediator.closed();}public void closed(){System.out.println("Valve is closed...");mediator.on();}
}

Valve类有两种方法,一种是open()方法,用于打开阀门;另一种是,在注满水时,它称为closed()方法。 但是请注意,它不是直接调用closed()方法,而是调用调解器的closed()方法,该调解器将调用此类的方法。

关闭阀门后,它会打开加热器,但再次调用调解员的方法,而不是直接调用加热器的方法。

package com.javacodegeeks.patterns.mediatorpattern;public class Heater implements Colleague {private MachineMediator mediator;@Overridepublic void setMediator(MachineMediator mediator){this.mediator = mediator;}public void on(int temp){System.out.println("Heater is on...");if(mediator.checkTemperature(temp)){System.out.println("Temperature is set to "+temp);mediator.off();}}public void off(){System.out.println("Heater is off...");mediator.wash();}
}

加热器的on()方法打开加热器并根据需要设置温度。 它还检查是否达到所需的温度,然后off()方法。 通过调解器检查温度并关闭加热器。

关闭后,它将通过中介程序调用Machine类的wash()方法以开始清洗。

如该公司所述,洗衣机具有一套洗涤程序,该软件应支持所有这些程序。 以下介体实际上是机器的清洗程序之一。 下面的介体被设置为棉花的洗涤程序,因此相应地设置了诸如温度,转鼓纺丝速度,去污水平等参数。 我们可以在不更改现有同事类别的情况下为不同的清洗程序使用不同的介体,从而提供松散的耦合性和可重用性。 所有这些同事课程都可以与其他洗衣机程序一起重复使用。

package com.javacodegeeks.patterns.mediatorpattern;public class CottonMediator implements MachineMediator{private final Machine machine;private final Heater heater;private final Motor motor;private final Sensor sensor;private final SoilRemoval soilRemoval;private final Valve valve;public CottonMediator(Machine machine,Heater heater,Motor motor,Sensor sensor,SoilRemoval soilRemoval,Valve valve){this.machine = machine;this.heater = heater;this.motor = motor;this.sensor = sensor;this.soilRemoval = soilRemoval;this.valve = valve;System.out.println(".........................Setting up for COTTON program.........................");}@Overridepublic void start() {machine.start();}@Overridepublic void wash() {motor.startMotor();motor.rotateDrum(700);System.out.println("Adding detergent");soilRemoval.low();System.out.println("Adding softener");}@Overridepublic void open() {valve.open();}@Overridepublic void closed() {valve.closed();}@Overridepublic void on() {heater.on(40);}@Overridepublic void off() {heater.off();}@Overridepublic boolean checkTemperature(int temp) {return sensor.checkTemperature(temp);}}

CottonMediator类实现MachineMediator接口并提供所需的方法。 这些方法是同事对象为了完成工作而执行的操作。 上面的调解器类仅代表另一个同事对象调用同事对象的方法即可实现此目的。

还有其他一些支持类:

package com.javacodegeeks.patterns.mediatorpattern;public class Sensor {public boolean checkTemperature(int temp){System.out.println("Temperature reached "+temp+" *C");return true;}}

Heater使用Sensor类别检查温度。

package com.javacodegeeks.patterns.mediatorpattern;public class SoilRemoval {public void low(){System.out.println("Setting Soil Removal to low");}public void medium(){System.out.println("Setting Soil Removal to medium");}public void high(){System.out.println("Setting Soil Removal to high");}
}

SoilRemoval类是由使用Machine类。

为了感受到Mediator Pattern的优势和力量,让我们以另一个用作牛仔布洗涤程序的Mediator为例。 现在,我们只需要创建一个新的介体并在其中设置洗牛仔布的规则即可:诸如温度,鼓旋转的速度,是否需要软化剂,除污水平等规则。无需更改现有结构中的任何内容。 不需要诸如“ if-else”之类的条件语句,这会增加复杂性。

package com.javacodegeeks.patterns.mediatorpattern;public class DenimMediator implements MachineMediator{private final Machine machine;private final Heater heater;private final Motor motor;private final Sensor sensor;private final SoilRemoval soilRemoval;private final Valve valve;public DenimMediator(Machine machine,Heater heater,Motor motor,Sensor sensor,SoilRemoval soilRemoval,Valve valve){this.machine = machine;this.heater = heater;this.motor = motor;this.sensor = sensor;this.soilRemoval = soilRemoval;this.valve = valve;System.out.println(".........................Setting up for DENIM program.........................");}@Overridepublic void start() {machine.start();}@Overridepublic void wash() {motor.startMotor();motor.rotateDrum(1400);System.out.println("Adding detergent");soilRemoval.medium();System.out.println("Adding softener");}@Overridepublic void open() {valve.open();}@Overridepublic void closed() {valve.closed();}@Overridepublic void on() {heater.on(30);}@Overridepublic void off() {heater.off();}@Overridepublic boolean checkTemperature(int temp) {return sensor.checkTemperature(temp);}}

您可以清楚地看到两个调解器类之间的差异。 温度不同,纺丝速度也不同,牛仔布洗涤不需要软化剂。

现在测试这些介体。

package com.javacodegeeks.patterns.mediatorpattern;public class TestMediator {public static void main(String[] args) {MachineMediator mediator = null;Sensor sensor = new Sensor();SoilRemoval soilRemoval = new SoilRemoval();Motor motor = new Motor();Machine machine = new Machine();Heater heater = new Heater();Valve valve = new Valve();Button button = new Button();mediator = new CottonMediator(machine, heater, motor, sensor, soilRemoval, valve);button.setMediator(mediator);machine.setMediator(mediator);heater.setMediator(mediator);valve.setMediator(mediator);button.press();System.out.println("******************************************************************************");mediator = new DenimMediator(machine, heater, motor, sensor, soilRemoval, valve);button.setMediator(mediator);machine.setMediator(mediator);heater.setMediator(mediator);valve.setMediator(mediator);button.press();}}

上面的程序将具有以下输出:

.........................Setting up for COTTON program.........................
Button pressed.
Valve is opened...
Filling water...
Valve is closed...
Heater is on...
Temperature reached 40 *C
Temperature is set to 40
Heater is off...
Start motor...
Rotating drum at 700 rpm.
Adding detergent
Setting Soil Removal to low
Adding softener
******************************************************************************
.........................Setting up for DENIM program.........................
Button pressed.
Valve is opened...
Filling water...
Valve is closed...
Heater is on...
Temperature reached 30 *C
Temperature is set to 30
Heater is off...
Start motor...
Rotating drum at 1400 rpm.
Adding detergent
Setting Soil Removal to medium
No softener is required

在上面的类中,我们创建了所需的对象,调解器(或者可以说不同的清洗程序),然后将清洗程序设置为同事,反之亦然,然后在按钮对象上调用了start()方法以启动机器。 其余的操作是自动完成的,无需任何人工干预。

请注意,仅在使用其他洗涤程序时,设置了其他介体,其余的保持不变。 您可以从输出中清楚地看到差异。

4.何时使用中介模式

  1. 一组对象以定义明确但复杂的方式进行通信。 由此产生的相互依存关系是无结构的,难以理解。
  2. 重用一个对象很困难,因为它引用了许多其他对象并与之通信。
  3. 在多个类之间分布的行为应该是可自定义的,而无需大量子类化。

5. JDK中的中介者模式

JDK中几乎所有地方都使用了设计模式。 以下是JDK中介体模式的用法。

  1. java.util.concurrent.ScheduledExecutorService (所有scheduleXXX()方法)
  2. java.util.concurrent.ExecutorServiceinvokeXXX()invokeXXX() submit()方法)
  3. java.util.concurrent.Executor#execute()
  4. java.util.Timer (所有scheduleXXX()方法)
  5. java.lang.reflect.Method#invoke()

6.下载源代码

这是“调解员模式”的一课。 您可以在此处下载源代码: MediatorPattern-Project

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/356942.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jvm需要多长时间才能进行转义分析? 可能比您想象的要长。

这篇文章着眼于转义分析,特别是jvm在运行的程序中执行转义分析需要多长时间。 我做了一些观察,但目前还没有全部解释。 作为介绍,让我们绕道看看jvm -Xcomp中一个鲜为人知且使用更少的标志(这将是一件好事)。 该标志…

Linux常用操作指令整理,这个操作服务器实在是太方便了

目录 前言 常用指令 系统管理命令 打包压缩相关命令 关机/重启机器 Linux管道 Linux软件包管理 vim使用 用户及用户组管理 更改文件的用户及用户组 文件权限管理 更改权限 前言 由于在银行工作,一个项目需要在云桌面、SIT、UAT、小版本、联调环境、准生产…

http invoker_Http Invoker的Spring Remoting支持

http invokerSpring HTTP Invoker是Java到Java远程处理的重要解决方案。 该技术使用标准的Java序列化机制通过HTTP公开服务,并且可以看作是替代方法,而不是Hessian和Burlap中的自定义序列化。 而且,它仅由Spring提供,因此客户端和…

前端实现数字快速递增_天正CAD教程之递增文字应用实例

好课推荐:1、CAD2014:点击查看 2、室内&全屋:点击查看 3、CAD2019:点击查看4、CAD2018:点击查看5、Bim教程:点击查看 6、室内手绘:点击查看7、CAD三维:点击查看8、全屋定制&…

模板设计模式示例

本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因,并了解何时以及如何应用模式中的每一个。 在这里查看 ! 目录 …

账号被暂时禁用使用VScode不能上传代码的解决办法

最近项目在开发的过程中突然不能提交代码,然后使用git账号登录gitee,发现账号账号不能登录了,不知道什么原因导致的禁用,这个账号sunjiaoshou01是被行方同步数据导致的禁用,一问管理员就说是可能一个月没登录会自动封禁…

地图库地之图地图窝_「方舆」秦朝地图及行政区划

秦朝是中国历史上一个极为重要的朝代,由战国时期的秦国发展起来的统一大国,它结束了自春秋起五百年来分裂割据的局面,成为中国历史上第一个大一统的中央集权制国家。秦朝统一六国时,国土面积为214万平方公里,后北收河套…

智能柜台C端代码规范

语法上建议:一、建议尽量使用””代替””上述比较好上述HX0188是一个字符串,用!替代比较好二、引用的组件/插件在当前vue文件内并未使用例:chk_bcip\src\business\common\views\ common-auditwait.vueDevice._$和Utils.AppUtils 都未使用&am…

华为云电脑和马云无影比_阿里云打造未来电脑无影,却因为5G限制,很难达到普及...

在9月17日,在2020阿里巴巴云栖大会上,阿里云发布了第一台云电脑"无影",极致的简约,一张卡片大小的机器就等于一台电脑了。看到这款电脑的宣传片,真的是极致的未来感,随随便便一块小透明玻璃就是电…

SQL SERVER 2016研究三

2016 SQL SEVER 全程加密程式 column encryption settingEnabled; 重点:需要使用.Net Framework 4.6 新建一个程式如下: 1、创建链接数据库,必选栏位,影响加密。 2、或者在web.config文件数据链接字符串增加如下语句: …

小车故障灯亮显示大全_史上最全汽车故障灯大全,留着一定有用!

大家好,我是汽修小诺,喜欢有关汽车知识的小伙伴请关注我哦,感谢大家!现在有车的朋友越来越多,开车途中难免会遇到汽车故障显示灯亮,从而不知道什么原因,有的朋友不敢开,等修理厂来检…

策略设计模式示例

本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因,并了解何时以及如何应用模式中的每一个。 在这里查看 ! 目录 …

vscode修改json.maxItemsComputed配置解决提示

由于要测试明细查询打印业务,分页每页显示30行,要打印30页以上的数据,在打印的过程中会出现分页的问题,这里使用仿真工具测试,需要修改mock数据,造数据,超过5000行就有提示了,需要扩…

【面试题系列|前端面试题】前端高频面试题总结(2021年最新版)

面试过不少前端从业者,简历写的平平淡淡,别人会的技能他也都会,看起来什么都掌握一些;有些会请过来当面聊一下,有些就直接拒绝了(如果是公司内要求独立完成项目的岗位,简历里放很多学习时候的DE…

观察者设计模式示例

本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因,并了解何时以及如何应用模式中的每一个。 在这里查看 ! 目录 …

震惊!2021年数十个技术领域图谱曝光,包含Golang、区块链、人工智能、架构师等领域学习路线

前言:不知道你是否和我一样,刚开始学习某个技术领域的时候缺乏坚持的动力,没有一个清晰的学习路线,学习的过程中没有人指导,遇到问题没人一起解答,想深入学习某个领域而又无从下手,不知道该从何处学起?这不,你想要的技术图谱来啦。有了这款武功秘籍,不光能开阔视野,…

70多套java必练项目,适合小白上手!

导读:这些项目不管是找工作练手,还是公司使用当作模板进一步改进,亦或者是当作毕业设计,都很有借鉴意义! 编译器建议使用:IDEA,Myeclipse,eclipse,HB-X等都可以。 数据库建议使用,mysql,oracle,…

mysql mycat 路由规则_Mycat分库路由规则

Mycat分库路由规则发布时间:2020-06-15 16:54:10来源:51CTO阅读:11651作者:lzf05303774一、Mycat分库路由分为连续路由和离散路由。1、连续路由:(1)、常用的路由方式:auto-sharding-long、sharding-by-date…

孙叫兽CSDN社区云----WebIT已创建,欢迎大家前端全栈小伙伴踊跃加入

目录 社区云是什么? 创建CSDN社区云WebIT的目的 推荐分享的技术点(如下图所示) 社区成员权益 版主权益 管理员权益 WebIT社区云积分规则 WebIT优质版主及管理员可以申请直播分享前端技术 WebIT社区云将为社区运营者提供: …

迭代器设计模式示例

本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因,并了解何时以及如何应用模式中的每一个。 在这里查看 ! 目录 …