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

中介者模式行为设计模式之一 ,因此它处理对象的行为。 中介器设计模式用于在系统中不同对象之间提供集中式通信介质。 根据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

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

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

相关文章

java gc full gc_Java中full gc什么意思?

慕雪6442864除直接调用System.gc外&#xff0c;触发Full GC执行的情况有如下四种。1. 旧生代空间不足旧生代空间只有在新生代对象转入及创建为大对象、大数组时才会出现不足的现象&#xff0c;当执行Full GC后空间仍然不足&#xff0c;则抛出如下错误&#xff1a;java.lang.Out…

springboot-RequestMappingHandlerMapping

作用&#xff1a;查看应用请求对应的ur和方法l情况 实例&#xff1a; RequestMappingHandlerMapping mapping applicationContext.getBean("requestMappingHandlerMapping",RequestMappingHandlerMapping.class);Map<RequestMappingInfo, HandlerMethod> map …

JavaScript中Ajax的用法

XMLHttpRequest 对象的属性和方法&#xff1a; open(method,url,async)  规定请求的类型、URL 以及是否异步处理请求  send(string)        将请求发送到服务器。  responseText       获得字符串形式的响应数据。  responseXML        获得 XM…

axios请求超时,设置重新请求的完美解决方法

自从使用Vue2之后&#xff0c;就使用官方推荐的axios的插件来调用API&#xff0c;在使用过程中&#xff0c;如果服务器或者网络不稳定掉包了, 你们该如何处理呢? 下面我给你们分享一下我的经历。 具体原因 最近公司在做一个项目, 服务端数据接口用的是Php输出的API, 有时候在…

从代码内部:骆驼路由引擎第一部分

因此&#xff0c;最近我重新燃起了对Apache Camel工作原理的兴趣。 Camel是一种功能强大的集成工具&#xff0c;用途非常广泛&#xff0c;但是只要我投入使用&#xff0c;我都会忍不住想&#xff1a;“嗯&#xff0c;这到底是怎么做到的&#xff01;” …猜想我只是有一个诀窍&…

java比较时间sql_如何正确比较日期 java.sql.Date

import java.sql.Date;...............例如今天是2010-12-2Date d1 new Date(System.currentTimeMili());Date d2 new Date(System.currentTimeMili()1);//比d1晚1毫秒日期上&#xff0c;我们认为d1和d2是相等的但是System.out.println(d1.before(d2));输出结果是true;其实我…

各种推导式合集

推导式的套路 之前我们已经学习了最简单的列表推导式和生成器表达式。但是除此之外&#xff0c;其实还有字典推导式、集合推导式等等。 下面是一个以列表推导式为例的推导式详细格式&#xff0c;同样适用于其他推导式。 variable [out_exp_res for out_exp in input_list if o…

javascript总结36:DOM-点击按钮切换图片案例

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>Title</title> </head><body><a href"http://www.baidu.com" id"link">点击切换</a> <br&g…

一个9年的技术最近一直担心找不到工作

我是一个从早期ASP ACCESS程序员慢慢转到一名从设计、前端到PHP后台MYSQL数据库都做的技术。07年末初入上海第一份工作1350RMB/月做ASP开发。到了春节离职了&#xff0c;当时只因同事间的关系没那么和谐&#xff0c;感觉不开心才提出的离职&#xff0c;试用期3个月&#xff0c;…

Spring MVC控制器的单元测试:REST API

Spring MVC提供了一种创建REST API的简便方法。 但是&#xff0c;为这些API编写全面而快速的单元测试一直很麻烦。 Spring MVC测试框架的发布使我们可以编写可读&#xff0c;全面且快速的单元测试。 这篇博客文章描述了如何使用Spring MVC Test框架编写REST API的单元测试。 在…

flask框架基本使用(2)(响应与重定向)

#转载请留言联系 flask 框架基本使用(1)&#xff1a;https://www.cnblogs.com/chichung/p/9756935.html 1. flask 自定义返回状态码与响应头 from flask import Flask,make_responseappFlask(__name__)app.route("/") def index():#666是指定的状态码&#xff0c;nam…

web.xml中webAppRootKey

<context-param> <param-name>webAppRootKey</param-name> <param-value>myproject.root</param-value> </context-param> 1、<param-value>里的值可以随便写配置。如果不配置默认值是"webapp.root"。 2、<param-value…

mpvue小程序以及微信直播踩坑总结

前段时间刚写完一个mpvue的小程序&#xff0c;现在得闲必须赶紧记录和总结一下&#xff0c;不然很多东西又要忘了 我是比较熟悉vue的语法&#xff0c;但是也犹豫过是用原生还是用mpvue&#xff0c;因为那时候原生小程序已经相当成熟而mpvue才刚出来&#xff08;踩坑和填坑的前…

适用于高级Java开发人员的十大书籍

Java是当今最流行的编程语言之一。 有很多适合初学者的书籍。 但是对于那些使用Java进行过一段时间编程的人来说&#xff0c;其中有些人看起来有些简单和多余。 初学者的书没有带来新鲜有趣的想法。 但是&#xff0c;高级Java书籍并不总是一应俱全&#xff0c;部分原因是因为它…

python apscheduler执行_python apscheduler 每两小时执行一次

from datetime import datetimefrom apscheduler.schedulers.blocking import BlockingSchedulerdef job_function():print("Hello World")sched BlockingScheduler()每2小时触发sched.add_job(job_function, interval, hours2)sched.start()设定执行区间sched.add_…

Ajax知识总结

一 AJAX Asynchronous JavaScript and XML&#xff08;异步的 JavaScript 和 XML&#xff09;。 AJAX 不是新的编程语言&#xff0c;而是一种使用现有标准的新方法。AJAX 最大的优点是在不重新加载整个页面的情况下&#xff0c;可以与服务器交换数据并更新部分网页内容。AJAX …

Leetcode 456. 132 Pattern

题目的意思就是给你一个数组 里面一堆数&#xff0c;你是否能找到这样三个数&#xff0c;第一个数比第三个数小&#xff0c;第二个数最大。比如 1, 3, 2 或者 4, 9, 5 这种&#xff0c;数字可以不连续在一起&#xff0c;但是要保证顺序不变&#xff0c;只要有这么一组数就可以…

「起点订阅页」Checkbox 美化引发的蝴蝶效应

本文作者&#xff1a;任家乐 原创声明&#xff1a;本文为阅文前端团队 YFE 成员出品&#xff0c;请尊重原创&#xff0c;转载请联系公众号 (id: yuewen_YFE) 获取授权&#xff0c;并注明作者、出处和链接。 性能风暴 「据说亚马逊雨林的一只蝴蝶偶尔扇动几下翅膀&#xff0c;可…

python polar函数_Python可视化很简单,可是你会吗?python绘制饼图、极线图和气泡图,让我来教教你吧,一文教会!!!...

matplotlib库作为Python数据化可视化的最经典和最常用库&#xff0c;掌握了它就相当于学会了Python的数据化可视化&#xff0c;今天呢&#xff0c;咱们就一起来聊聊关于Python如何去绘制饼图、极线图和气泡图吧好啦&#xff0c;废话少说&#xff0c;咱们就开始吧&#xff01;用…

Java中的访问者设计模式–示例教程

访客模式是行为设计模式之一 。 当我们必须对一组相似类型的对象执行操作时&#xff0c;将使用访问者模式。 借助访问者模式&#xff0c;我们可以将操作逻辑从对象移动到另一个类。 例如&#xff0c;假设有一个购物车&#xff0c;我们可以在其中添加不同类型的项目&#xff08…