中介者模式行为设计模式之一 ,因此它处理对象的行为。 中介器设计模式用于在系统中不同对象之间提供集中式通信介质。 根据GoF,中介者模式意图是:

通过封装不同对象集相互交互和通信的方式,允许松散耦合。 允许每个对象集的动作彼此独立地变化。

在多个对象相互交互的企业应用程序中,中介器设计模式非常有帮助。 如果对象彼此直接交互,则系统组件彼此紧密耦合,这使可维护性成本更高,并且难以灵活扩展。 中介器模式着重于在对象之间提供介体以进行通信,并帮助实现对象之间的损耗耦合。

空中交通管制员是调解员模式的一个很好的例子,其中机场控制室充当不同航班之间通信的调解员。 中介器充当对象之间的路由器,并且可以具有自己的逻辑来提供通信方式。

相互通信的系统对象称为同事。 通常,我们有一个提供通信契约的接口或抽象类 ,然后我们有介体的具体实现。

对于我们的示例,我们将尝试实现一个聊天应用程序,用户可以在其中进行群聊。 每个用户都将通过其名称进行标识,他们可以发送和接收消息。 任何用户发送的消息都应被组中的所有其他用户接收。

介体介面

首先,我们将创建Mediator接口,该接口将为具体的调解人定义合同。

package com.journaldev.design.mediator;public interface ChatMediator {public void sendMessage(String msg, User user);void addUser(User user);
}

同事界面

用户可以发送和接收消息,因此我们可以具有用户界面或抽象类。 我创建用户作为抽象类,如下所示。

package com.journaldev.design.mediator;public abstract class User {protected ChatMediator mediator;protected String name;public User(ChatMediator med, String name){this.mediator=med;this.name=name;}public abstract void send(String msg);public abstract void receive(String msg);
}

请注意,用户具有对中介对象的引用,这是不同用户之间进行通信所必需的。

混凝土调解员

现在,我们将创建具体的调解器类,它将在组中具有用户列表,并为用户之间的通信提供逻辑。

package com.journaldev.design.mediator;import java.util.ArrayList;
import java.util.List;public class ChatMediatorImpl implements ChatMediator {private List<User> users;public ChatMediatorImpl(){this.users=new ArrayList<>();}@Overridepublic void addUser(User user){this.users.add(user);}@Overridepublic void sendMessage(String msg, User user) {for(User u : this.users){//message should not be received by the user sending itif(u != user){u.receive(msg);}}}}

具体同事

现在,我们可以创建供客户端系统使用的具体User类。

package com.journaldev.design.mediator;public class UserImpl extends User {public UserImpl(ChatMediator med, String name) {super(med, name);}@Overridepublic void send(String msg){System.out.println(this.name+": Sending Message="+msg);mediator.sendMessage(msg, this);}@Overridepublic void receive(String msg) {System.out.println(this.name+": Received Message:"+msg);}}

请注意,send()方法正在使用中介程序将消息发送给用户,并且不知道中介程序将如何处理该消息。

中介者模式客户端

让我们用一个简单的程序测试我们的聊天应用程序,在该程序中,我们将创建调解器并将用户添加到组中,并且其中一个用户将发送一条消息。

package com.journaldev.design.mediator;public class ChatClient {public static void main(String[] args) {ChatMediator mediator = new ChatMediatorImpl();User user1 = new UserImpl(mediator, "Pankaj");User user2 = new UserImpl(mediator, "Lisa");User user3 = new UserImpl(mediator, "Saurabh");User user4 = new UserImpl(mediator, "David");mediator.addUser(user1);mediator.addUser(user2);mediator.addUser(user3);mediator.addUser(user4);user1.send("Hi All");}}

请注意,客户端程序非常简单,并且不知道如何处理消息以及中介程序是否正在获得用户。

上面程序的输出是:

Pankaj: Sending Message=Hi All
Lisa: Received Message:Hi All
Saurabh: Received Message:Hi All
David: Received Message:Hi All

中介者模式类图

JDK中的中介者模式

  • java.util.Timer类scheduleXXX()方法
  • Java并发执行器 execute()方法。
  • java.lang.reflect.Method invoke()方法。

重要事项

  • 当对象之间的通信逻辑复杂时,调解器模式很有用,我们可以拥有一个通信的中心点来处理通信逻辑。
  • Java消息服务(JMS)使用Mediator模式和Observer模式来允许应用程序将数据订阅和发布到其他应用程序。
  • 我们不应该仅使用调解器模式来实现损失耦合,因为如果调解器的数量增加,那么将很难维持它们。
参考: Java中的介体设计模式– JCG合作伙伴 Pankaj Kumar在开发人员食谱博客上的示例教程 。

翻译自: https://www.javacodegeeks.com/2013/08/mediator-design-pattern-in-java-example-tutorial.html

Java中的中介器设计模式-示例教程相关推荐

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

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

  2. Java中的中介器设计模式

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

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

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

  4. 装饰着模式示例_装饰器设计模式示例

    装饰着模式示例 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式如此重要的原 ...

  5. Java设计模式 - 示例教程

    Java设计模式 - 示例教程 设计模式在软件开发人员中非常流行.设计模式是针对常见软件问题的良好描述的解决方案.我已经写了很多关于java设计模式的文章.您可以订阅我们的时事通讯下载PDF电子书(1 ...

  6. java 设计模式 示例_Java设计模式–示例教程

    java 设计模式 示例 Design Patterns are very popular among software developers. A design pattern is a well- ...

  7. Java依赖注入 - DI设计模式示例教程

    Java依赖注入 - DI设计模式示例教程 Java依赖注入 设计模式允许我们删除硬编码的依赖项,并使我们的应用程序松散耦合,可扩展和可维护.我们可以在java中实现依赖注入,以将依赖项解析从编译时移 ...

  8. Thrift介绍以及Java中使用Thrift实现RPC示例

    场景 Thrift Thrift最初由Facebook研发,主要用于各个服务之间的RPC通信,支持跨语言,常用的语言比如C++, Java, Python,PHP, Ruby, Erlang,Perl ...

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

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

最新文章

  1. (MyEclipse) MyEclipse完美破解方法(图)
  2. 聊聊数据库和缓存同步机制
  3. hibernate mysql自定义变量_hibernate如何得到mysql的变量
  4. Maven引入外部jar的几种方法
  5. 男人最佳的生育年限,程序猿们,看看吧!!!
  6. PHP创建与解析 XML 1 (36)
  7. C 语言:我不是针对谁,我是说在座的都是乐色
  8. Swift之动画总结
  9. 苹果ipad怎么录屏_追剧,玩游戏必备,这才是苹果手机正确的投屏操作,网友:没白拿...
  10. 地图学(何宗宜版)知识点整理
  11. Android Studio在运行时显示Please Select Android SDK的解决方法
  12. 长沙云长计算机,【长沙记忆】原来关羽和长沙有这么多不解之缘
  13. 别说 Python 会生成二维码,Java也会。
  14. CDN与智能DNS 基本原理
  15. [附源码]Java计算机毕业设计SSM常见病辅助食疗系统
  16. 什么是熔断?什么是服务降级?
  17. Git内部原理之深入解析环境变量
  18. 【数据共享】深度学习异常行为数据集—疲劳驾驶数据集—行为分析数据集
  19. 选择DC-DC开关电源控制器的实战过程
  20. 想在国外做CPA广告联盟,准备好洗礼了吗?

热门文章

  1. 【spring boot】启动类启动 错误: 找不到或无法加载主类 com.codingapi.tm.TxManagerApplication 的解决方案
  2. SpringBoot+MyBatis搭建迷你小程序
  3. java流与文件——文本输入输出
  4. java泛型——桥方法
  5. jvm回收垃圾_没有垃圾回收的JVM
  6. wildfly_从WildFly 9(子系统)中运行OkHttpClient
  7. aop 获取注解注释的方法_带有AOP和注释的Java方法记录
  8. JMetro版本11.5.10和8.5.10发布
  9. 在Eclipse中使用Java 12
  10. 可见性得以保障,并不意味着_战略模式并不意味着春天!