Java设计模式-中介者模式Mediator

news2024/11/15 13:45:35

在这里插入图片描述

介绍

  1. 中介者模式(Mediator Pattern),用一个中介对象来封装一系列的对象交互。中介者使各个对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
  2. 中介者模式属于行为型模式,使代码易于维护。
  3. 比如 MVC 模式,C(Controller 控制器)是 M(Model 模型)和 V(View 视图)的中介者,在前后端交互时起到了中间人的作用。

原理类图

  1. Mediator 就是抽象中介者,定义了同事对象到中介者对象的接口
  2. Colleague 是抽象同事类
  3. ConcreteMediator 具体的中介者对象, 实现抽象方法, 他需要知道所有的具体的同事类,即以一个集合来管理
    HashMap,并接受某个同事对象消息,完成相应的任务
  4. ConcreteColleague 具体的同事类,会有很多, 每个同事只知道自己的行为,而不了解其他同事类的行为(方法),但 是他们都依赖中介者对象
    在这里插入图片描述

实战案例

在这里插入图片描述

  1. 首先,我们将创建Mediator接口,该接口将定义具体中介者接口
public interface ChatMediator {

	public void sendMessage(String msg, User user);

	void addUser(User user);
}
  1. 用户可以发送和接收消息,所以我们可以有用户界面或抽象类。我正在创建User作为如下抽象类。User.java
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);
}
  1. 现在我们将创建一个具体的中介类,它将包含组中的用户列表,并为用户之间的通信提供逻辑:
public class ChatMediatorImpl implements ChatMediator {

	private List<User> users;
	
	public ChatMediatorImpl(){
		this.users=new ArrayList<>();
	}
	
	@Override
	public void addUser(User user){
		this.users.add(user);
	}
	
	@Override
	public void sendMessage(String msg, User user) {
		for(User u : this.users){
			//message should not be received by the user sending it
			if(u != user){
				u.receive(msg);
			}
		}
	}

}
  1. 现在我们可以创建客户端系统使用的具体User类:
public class UserImpl extends User {

	public UserImpl(ChatMediator med, String name) {
		super(med, name);
	}

	@Override
	public void send(String msg){
		System.out.println(this.name+": Sending Message="+msg);
		mediator.sendMessage(msg, this);
	}
	@Override
	public void receive(String msg) {
		System.out.println(this.name+": Received Message:"+msg);
	}

}
  1. 让我们用一个简单的程序来测试我们的聊天应用程序,我们将在其中创建调解器并将用户添加到组中,其中一个用户将发送消息:
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");
		
	}

}
  • 输出:
    在这里插入图片描述

JDK中的案例

  • java.util.Timer类scheduleXXX()方法

  • java并发执行器execute()方法。

  • java.lang.reflect.Method invoke()方法。

注意事项

  1. 多个类相互耦合,会形成网状结构, 使用中介者模式将网状结构分离为星型结构,进行解耦
  2. 减少类间依赖,降低了耦合,符合迪米特原则
  3. 中介者承担了较多的责任,一旦中介者出现了问题,整个系统就会受到影响
  4. 如果设计不当,中介者对象本身变得过于复杂,这点在实际使用时,要特别注意

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

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

相关文章

linux搭建webapp实战

首先介绍下linux&#xff0c;linux因其开源&#xff0c;定制化高&#xff0c;安全等原因&#xff0c;成为了目前web应用部署首选的操作系统&#xff0c;linux操作系统有很多版本&#xff0c;常见的有centos&#xff0c;debian&#xff0c;RHLE&#xff0c;redhat&#xff0c;乌…

【Linux】gcc/g++编译器、make/Makefile自动化构建工具

作者&#xff1a;小卢 专栏&#xff1a;《Linux》 喜欢的话&#xff1a;世间因为少年的挺身而出&#xff0c;而更加瑰丽。 ——《人民日报》 目录 1.gcc/c的概念&#xff1a; 2.程序编译过程详解&#xff1a; 2.1程序编译过程&#xff1a; 2.…

微电网(风、光、储能、需求响应)【Simulink 仿真实现】

目录 1 展现 2 典型几个介绍 2.1 采用PR的三相逆变器电压控制 2.2 太阳能直流微电网系统 2.3 主电网故障时的交流微电网性能 2.4 混合光伏、双馈发电和电池能源的微电网集成 3 写在后面 4 完整资源 1 展现 随便打开一个&#xff0c;就以第一个&#xff08;采用PID的三…

【GD32F427开发板试用】macOS/Linux系统开发环境搭建(开发、编译、烧录、调试)

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动&#xff0c;更多开发板试用活动请关注极术社区网站。作者&#xff1a;HonestQiao 我日常的工作环境使用的是macOS系统或者Linux系统&#xff0c;万不得已才使用Windows。 GD32官方提供了Keil MDK-ARM和IAR两款工具…

如何使用Dx命令将jar打包成Dex,需要使用D8命令

使用dx打包的完整命令&#xff0c;将D:\ssh1.0.jar打包成MyClass.dex&#xff0c;MyClass.dex将会输出在当前CMD命令窗口的目录下。dx --dex --no-strict --min-sdk-version26 --outputMyClass.dex D:\ssh1.0.jar运行结果&#xff1a;不要使用dx命令&#xff0c;打出来的dex可以…

NestJS 项目实战 技术选型 (文末附视频)

前言 通过上一章的学习&#xff0c;我们了解了网关系统&#xff0c;并且针对要做的功能做了项目架构设计与需求拆解。 那在一个项目正式开发之前&#xff0c;我们还需要做一个技术调研&#xff0c;从开发框架、使用的工具、数据库等等进行一系列的预研&#xff0c;避免在业务…

嘿~ 基于分布式架构的技术交流社区(WhiteHoleV0.7)即将竣工!

文章目录前言项目介绍WhiteHole期望立项作者功能/模块简介用户模块问答模块社区模块博文模块Next前言 拖更&#xff0c;拖延了这么久&#xff0c;耗时超过3个月的项目&#xff0c;WhiteHoleV0.7 版本即将迎来最后的收尾工作。当然考虑到服务成本&#xff0c;和开发进度&#x…

【以太网硬件十九】SGMII到底能不能直接出光模块?

SGMII接口到底能不能直接出光模块&#xff1f;先说结论&#xff1a;我认为可以&#xff0c;但是有限制&#xff0c;此时的光口只支持强制模式&#xff0c;不支持自协商。如果对端是1000base-X接口&#xff0c;对端也需要把自协商关闭才能与SGMII直出的光口建立连接。为什么SGMI…

你是真的“C”——C语言详解求素数n种境界~

详解C语言函数模块知识(下篇&#xff09;&#x1f60e;前言&#x1f64c;必备小知识~&#x1f618;C语言详解《试除法》求解素数&#x1f64c;试除法第一层境界~ &#x1f60a;试除法境界2~&#x1f60a;试除法境界3~&#x1f60a;试除法境界4~&#x1f60a;C语言详解《筛选法》…

为何限制英伟达出售GPU芯片?中国的AI技术领先,让美国怕了

2022年下半年美国突然要求GPU芯片领军者NVIDIA停止对中国出售高端GPU芯片&#xff0c;此举让人疑惑不解&#xff0c;近期日本媒体《日本经济新闻》与荷兰的一家学术信息巨头的分析给出了答案&#xff0c;中国在AI技术上已领先于美国&#xff0c;而NVIDIA的高端GPU芯片有助于中国…

Web端即时通信技术-WebSocket

最近在做项目的时候&#xff0c;遇到了一个前端页面需要实时刷新的功能&#xff0c;一种方法是我们通过短轮询的方式&#xff0c;但这种方式虽然简单&#xff0c;但是无用的请求过多&#xff0c;占用资源&#xff0c;并且如果是对数据要求高较高的场景&#xff0c;就不适用了。…

汽车ECU软件开发之应用层软件与底层软件

随着汽车产品日渐趋向电子化&#xff0c;人们对各类先进的安全系统、高级驾驶辅助系统的接受程度日益提升。而原本昂贵的盲点检测、自动紧急制动等功能的成本下滑&#xff0c;使其快速获得了市场青睐。富士奇美拉研究所&#xff08;Fuji Chimera Research Institute&#xff09…

MySQL算术/比较/逻辑/位/运算符与正则全解

文章目录1. 算术运算符加法与减法运算符乘法与除法运算符求模&#xff08;求余&#xff09;运算符2. 比较运算符等号运算符安全等于运算符不等于运算符非符号类型的运算符空运算符非空运算符最小值运算符最大值运算符BETWEEN AND运算符IN运算符NOT IN运算符LIKE运算符ESCAPEREG…

〖金融帝国实验室〗(Capitalism Lab)v8.2.00官方重大版本更新(2023.01.17正式发布)

〖金融帝国实验室〗&#xff08;CapLab&#xff09;v8.2.00正式发布&#xff01; ————————————— ※v8.2.00更新内容摘要&#xff1a; 1.新增生活服务业&#xff1a;快餐店、比萨店、蛋糕店和咖啡店。 2.可以通过在农场周围购买土地并耕耘来实现产能扩容。 3.…

九龙证券|重磅会议召开,工信部强调推进民爆行业高质量发展

工信部强调推动民爆职业高质量开展&#xff0c;民爆概念股午后拉升。 工业和信息化部举行 民爆职业安全出产视频会议 据工信部网站&#xff0c;1月17日&#xff0c;工业和信息化部举行民爆职业安全出产视频会议。 工业和信息化部副部长徐晓兰表明&#xff0c;部党组对安全出…

【Linux操作系统】环境变量和命令行参数

文章目录一.环境变量1.什么是环境变量&#xff1f;2.windows下配置PATH环境变量的原理3.一览常见的环境变量4.指令方式如何查看环境变量5.PATH-存放系统默认搜索路径的环境变量6.两种方法使运行我们写的可执行程序不带路径二.环境变量和本地变量三.和环境变量相关的命令1.echo:…

元组的操作

1 元组的定义&#xff1a; 元组就是用一对小括号括起来的多个元素的有序集合&#xff0c;个元素之间用逗号隔开。 2 元组的创建&#xff1a; 2.1 使用&#xff08;&#xff09;创建元组对象。例&#xff1a;lt(12,34,"one") 2.2 使用内置方法tuple创建元组对象。…

mysql 为什么说加上了索引,查询速度就快了呢?(文末附视频)

一天&#xff0c;老板跟我们提出说网站访问的速度太慢&#xff0c;要求我们尽快优化一下。我赶快去查询了一下&#xff0c;发现有几条 SQL 查询的时间异常&#xff0c;我相信这个时候很多小伙伴的大脑里浮现出来的第一个解决办法就是&#xff1a;加索引。 那么到底什么是索引呢…

字符加密-C语言实现

任务描述 请编写程序将一串5个字符组成的英文字符串译成密码&#xff0c;规则为&#xff1a;例如&#xff0c;将“China”译成密码&#xff0c;密码规律是&#xff1a;用原来的字母后面第4个字母代替原来的字母。例如&#xff0c;字母A后面第4个字母是“E”&#xff0c;用“E”…

虚拟电厂负荷控制系统三维可视化监控 | 数字孪生

随着国家“双碳”及“构建以新能源为主体的新型电力系统”等目标的提出&#xff0c;清洁化、数字化越来越成为电力系统面临的迫切需求&#xff0c;负控系统的发展对电力营销现代化建设具有重要的意义。负控管理系统是一个着眼于全面加强电力信息管理的&#xff0c;集负荷控制、…