设计模式示例_介体设计模式示例

设计模式示例

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

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

目录

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

1.简介

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

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

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

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

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

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

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

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

2.什么是中介者模式

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

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

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

图1

图1

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

图2

图2

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

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

图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类。

为了感觉到介体模式的优势和力量,让我们以另一个用作牛仔布洗涤程序的介体为例。 现在,我们只需要创建一个新的介体并在其中设置洗牛仔布的规则即可:诸如温度,鼓旋转的速度,是否需要软化剂,去污水平等规则。无需更改现有结构中的任何内容。 不需要诸如“ 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/336949.shtml

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

相关文章

清空list_还在为邮箱爆掉而烦恼吗?学会清空你的收件箱

less is more | 越不繁,越不凡还在为邮箱爆掉而烦恼吗?学会清空你的收件箱我一般只用Gmail收发邮件,而且处理邮件已经成为日常工作的核心之一。我每个小时能收到大量邮件,并且快速回复。但是,有一件事要特别提一下&…

这才是B站的正确打开方式!

关注星标,每天学习C语言新技能因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源:网络每天都在用B站刷杂七杂八的视频,有没有考虑过挖掘一些优质UP主?想要发掘优质UP主,靠B站官方…

pcl_openmap_OpenMap教程–第1部分

pcl_openmap介绍 本系列教程将向您展示如何使用OpenMap GIS Java Swing库构建Java应用程序。 OpenMap的开发人员指南是非常有用的文档,描述了OpenMap的体系结构,但没有说明如何逐步启动和构建应用程序。 源代码附带的示例很有用,但还不够。 …

网页编程从入门到精通 杨凡_干货 | web前端入门基础知识

一名合格的web前端工程师必须得掌握HTML、CSS和JavaScript。只懂其中一个或两个还不行,你必须对这三门语言都很熟悉。也不是说必须对这三门语言都非常精通,但你至少要能够运用它们完成大多数任务,而无需地频繁地寻求别人的帮助。今天给大家分…

100 个网络基础知识

关注星标,每天学习C语言新技能因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源:网络1)什么是链接?链接是指两个设备之间的连接。它包括用于一个设备能够与另一个设备通信的电缆类型和协议。2)OSI 参考模型的层次…

策略模式示例代码_策略设计模式示例

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

加白名单_Android保活从入门到放弃:乖乖引导用户加白名单吧

1、引言IM在Android上的保活问题经常在即时通讯网的论坛和技术群里被讨论,自从Android 8.0后系统大大降低了后台运行应用的保活容忍度(详见《Android P正式版即将到来:后台应用保活、消息推送的真正噩梦》),保活从黑科技横行的时代进入了技术…

子模板继承父模板示例_模板设计模式示例

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

10个超赞的C语言开源项目!

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删今天分享10个超赞的C语言开源项目,希望这些内容能对大家有所帮助!目录:1. Webbench2. Tinyhttpd3. cJSON4. C…

jboss eap 7_使用JBoss EAP 7的HTTP / 2

jboss eap 7就在几天前,新的JBoss EAP 7 ALPHA版本已经发布。 而且我已经写过博客,介绍如何开始使用它 。 一个非常有趣的部分是HTTP / 2支持,它已作为技术预览添加。 它由新的Web服务器Untertow提供。 HTTP / 2通过压缩头并在同一TCP连接上多…

Modern C++ 最核心的变化是什么?

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删个人觉得最核心的变化是右值引用的引入,右值引用是 C 走向现代化的最重要一步。建议每一位 C 开发者都应该深入去了解并充分使用它。…

设计模式示例_命令设计模式示例

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

第一个C语言编译器是怎样编写的

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删不知道你有没有想过,某种编程语言的第一个编译器是怎么来的呢?这不就是“鸡生蛋,蛋生鸡”的问题吗&#xff1…

备忘录模式 命令模式_备忘录设计模式示例

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

还在分析我写的 bug 啊,我都是随便写的!

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删还在分析我写的 bug 啊,我都是随便写的!客户就是可以为所欲为,怎么地!下面教大家如何对付产品经理…

mysql如何让表建立连接吗_MySQL 表与表之间建立关系

引子:如下图是一张非常寻常的表格,在以前的工作中实常会制作类似的表格,但是今天的数据库内容,将我之前这种传统的制表思路上升了一个层次;今天核心的内容就是怎样让表与表之间产生关系,在思考这个问题的时…

访客模式 无痕模式 区别_访客设计模式示例

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

项目经理升职了是啥_什么是升职率?

项目经理升职了是啥我确实相信您熟悉彼得原则 。 一般而言,该原则是一种观察,即晋升可能会并且将导致晋升人员不再符合工作资格的情况。 对于JVM,存在类似的问题。 太快地提升对象可能会对性能产生重大影响。 在这篇文章中,我们将…

mysql事件定时_MySQL事件(定时任务)

whats the MySQL 事件MySQL5.1 版本开始引进 event 概念,MySQL 中的事件(event:时间触发器)是用于执行定时或周期性的任务,类似 Linux 中的 crontab,事件可以精确到秒。通过单独或调用存储过程使用,在某一特定的时间点…

lucene简介_Lucene简介

lucene简介本文是我们名为“ Apache Lucene基础知识 ”的学院课程的一部分。 在本课程中,您将了解Lucene。 您将了解为什么这样的库很重要,然后了解Lucene中搜索的工作方式。 此外,您将学习如何将Lucene Search集成到您自己的应用程序中&…