Java设计模式 _行为型模式_中介者模式

一、中介者模式
1、中介者模式
中介者模式(Mediator Pattern)是一种行为型模式。主要通过一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。

2、实现思路
(1)、定义实体对象的规范行为接口。
(2)、编写实现类,需要内置中介类。需要通过中介接收数据。
(3)、定义中介类,包含实体类对象的集合。将接收到的信息传送给具体的实现对象。

二、代码示例
1、示例场景
用户聊天室,张三发送消息到聊天室,李四可以接收;李四发送消息到聊天室,张三可以接收。
2、代码示例

// 1、定义用户规范行为
public interface User {void sendMsg(String msg, String reveiveUser);void receiveMsg(String msg);String getName();
}
// 2、定义中介类,包含用户类的集合,包含消息的转发实现
import org.springframework.util.CollectionUtils;import java.util.ArrayList;
import java.util.List;public class ChatRoom {static List<User> userList = new ArrayList<>();public void addUser(User user) {this.userList.add(user);}public void removeUser(String userName) {if (!CollectionUtils.isEmpty(userList)) {for (User user : userList) {if (user.getName().equals(userName)) {this.userList.remove(user);}}}}public void sendMsg(User sender, String msg, String receiveName) {if (!CollectionUtils.isEmpty(userList)) {for (User user : userList) {if (user.getName().equals(receiveName)) {user.receiveMsg(sender.getName() + "发送消息:" + msg);}}}}
}// 3、定义用户的实现类
import lombok.Data;
@Data
public class ChatUser implements User {private String name;private ChatRoom chatRoom;public String getName() {return name;}public ChatUser(String name, ChatRoom chatRoom) {this.name = name;this.chatRoom = chatRoom;}@Overridepublic void sendMsg(String msg, String reveiveUser) {chatRoom.sendMsg(this, msg, reveiveUser);}@Overridepublic void receiveMsg(String msg) {System.out.println(msg);}
}
// 4、测试
public static void main(String[] args) {ChatRoom room = new ChatRoom();User user = new ChatUser("张三", room);User user1 = new ChatUser("李四", room);room.addUser(user);room.addUser(user1);Scanner scanner = new Scanner(System.in);int num = 0;while (true) {String msg = scanner.nextLine();if (num % 2 == 0) {user.sendMsg(msg, "李四");} else {user1.sendMsg(msg, "张三");}num++;}}

运行结果:
在这里插入图片描述
可以看到张三发送消息到聊天室,聊天室调用了李四的接收方法;李四发送消息到聊天室,聊天室调用了张三的接收方法。

总结:
中介者模式,顾名思义,就是通过中间人的介入完成不同业务之间的解耦行为。在生活中非常常见,放到代码中也很好理解。主要特点为实体对象和中介者产生关联,消费对象也和中介者产生关联。在代码实现上,一般多通过内置对象的形式,即对象实体内包含中介对象,中介对象内包含实体对象集合等,两者之间可以通过各自的方法去添加彼此。

学海无涯苦作舟!!!

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

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

相关文章

U-Net结构的特点

U-Net是一种用于图像分割的卷积神经网络架构&#xff0c;最初由Olaf Ronneberger等人提出&#xff0c;专门用于生物医学图像的分割任务。其设计特点和结构使其在各种图像分割任务中表现出色。以下是U-Net结构的主要特点和关键组件&#xff1a; 1. U形结构 U-Net的整体结构呈现…

使用arco design实现动态列信息的表格

目录 1.说明 2.普通表格的实现 3.动态表格的实现 1.说明 在前端画面中&#xff0c;表格一般用来展示列表数据&#xff0c;并且可以实现分页&#xff0c;应用很广泛&#xff0c;关于表格的列信息&#xff0c;一般是固定的&#xff0c;也可以是变化的&#xff0c;根据后端传递…

一文读懂 javascript 函数返回值

文章导读&#xff1a;AI 辅助学习前端&#xff0c;包含入门、进阶、高级部分前端系列内容&#xff0c;当前是 JavaScript 的部分&#xff0c;瑶琴会持续更新&#xff0c;适合零基础的朋友&#xff0c;已有前端工作经验的可以不看&#xff0c;也可以当作基础知识回顾。 这篇文章…

怎么提取pdf格式中的英语单词

思路&#xff1a; 第一步&#xff1a;适用python把需要导出的pdf文件单词导出到txt 第二步&#xff1a;把导出的txt导入到软件单词库&#xff0c;例如&#xff0c;金山词霸等软件内 第三步&#xff1a;熟练掌握以及删除单词库部分单词&#xff0c;达到对英文标准的单词记忆&…

0528-算法岗面试题

多模态 CLIP原理 描述对比学习函数 BLIP BLIP2架构和区别 LLaVa和BLIP2区别 LLaVa两阶段的训练过程和数据集的构建 LLaVa1.5 1.6的改进 cross-attention和self-attention区别 cross-attention在图文匹配中q和kv分别指什么&#xff0c;在机器翻译中分别指什么 one shot&#xf…

okcc呼叫中心如何创建语音群呼(通知)功能?

要在OKCC呼叫中心系统中创建语音群呼&#xff08;通知&#xff09;功能&#xff0c;您可以按照以下步骤进行&#xff1a; 准备语音通知内容&#xff1a; 确定您想要发送的语音通知内容&#xff0c;包括文字内容和语音录音。 配置群呼功能&#xff1a; 在OKCC呼叫中心系统的管理…

【Linux】-Kafka集群安装部署[18]

简介 Apache Kafka是一款分布式的、去中心化的、高吞吐低延迟、订阅模式的消息队列系统。 同RabbitMQ一样&#xff0c;Kafka也是消息队列。不过RabbitMQ多用于后端系统&#xff0c;因其更加专注于消息的延迟和容错。 Kafka多用于大数据体系&#xff0c;因其更加专注于数据的…

Oracle数据库之事务(十四)

在Oracle数据库中&#xff0c;事务是工作的逻辑单元&#xff0c;用于确保数据的一致性和完整性。以下是对Oracle事务的详细解释&#xff1a; 1. 定义 事务&#xff1a;在数据库中&#xff0c;事务是由一个或多个SQL语句组成的逻辑单元&#xff0c;这些语句共同完成一组相关的…

K210 数字识别 笔记

一、烧写固件 连接k210开发板&#xff0c;点开烧录固件工具&#xff0c;选中固件&#xff0c;并下载 二、模型训练 网站&#xff1a;MaixHub 1、上传文件 2、开始标记数据 添加9个标签&#xff0c;命名为1~9&#xff0c;按键盘w开始标记&#xff0c;键盘D可以下一张图片&…

解密Prompt系列15. LLM Agent之数据库应用设计:DIN C3 SQL-Palm BIRD

上一章我们主要讲搜索引擎和LLM的应用设计&#xff0c;这一章我们来唠唠大模型和DB数据库之间的交互方案。有很多数据平台已经接入&#xff0c;可以先去玩玩再来看下面的实现方案&#xff0c;推荐 [sql translate]&#xff1a;简单&#xff0c;文本到SQL&#xff0c;SQL到文本…

Github 2024-05-21 开源项目日报 Top10

根据Github Trendings的统计,今日(2024-05-21统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Rust项目2C项目2TypeScript项目2非开发语言项目2Vim Script项目1Lua项目1Python项目1Batchfile项目1Go项目1Windows和Office激活工具 创建周期:…

<网络安全VIP>第一篇《工业互联网安全》

1 工业互联网介绍 工业互联网的网络是基础&#xff0c;平台是核心&#xff0c;安全是保障。信息化会提高工业化的生产效率&#xff0c;但信息化本身具备两面性。一方面它可以让信息交互更加顺畅&#xff0c;共享更加快捷&#xff1b;但另一方面是带来相应的安全威胁。 2 工业…

后端企业级开发之yaml数据序列化格式文件详解2024

yaml格式 数据格式 yaml 是一种数据序列化的格式 容易阅读 容易与脚本语言交互 以数据为核心 重数据轻格式 我们要知道他怎么书写 大小写敏感 属性层级关系使用多行描述 每行结尾使用冒号结束 使用缩进表示层级关系 同层级左侧对其 只运行使用空格 属性前面添加空格 #表…

学习前端滚动容器

学习前端滚动容器 一、前言1、创建基本的滚动容器组件2、解析代码 二、示例应用1、使用滚动容器组件2、创建滚动容器组件结语 一、前言 滚动容器是指在页面布局中可以垂直或水平滚动其内容的区域。这种技术通常用于处理内容过长而导致溢出的情况&#xff0c;例如长表单、大段文…

面试二十六、c++语言级别的多线程编程

一、 多线程编程 ​​​​​ 这里的c语言级别的多线程和linux的有一定的区别&#xff0c;c语言级别提供的多线程比较严格&#xff0c;如果主线程结束了&#xff0c;但是子线程没有结束&#xff0c;进程就会异常终止&#xff0c;而linux不会&#xff0c;会继续执行。 二、模拟卖…

Window VScode配置Conda教程(成功版)

VScode配置Conda 参考博文&#xff1a;https://blog.csdn.net/qq_51831335/article/details/126757014Anaconda安装&#xff08;注意勾选自动配置环境变量&#xff01;&#xff09; 官网&#xff1a;https://www.anaconda.com/download/success VScode配置 python插件安装安装 …

关于Java程序入口args参数

关于Java程序入口args参数 我们都知道一个java工程会有一个主程序入口&#xff0c;即我们常见到的如下代码 public static void main(String[] args) {// 中间程序 }但是很多人可能都不知道主程序入口中的String[] args后面的args会有怎么样一个使用场景呢&#xff1f; 其实在…

爬虫逆向实例小记——某数据知识管理网站-DES-ECB模式

aHR0cHM6Ly9rZC5uc2ZjLmNuL2ZpbmFsUHJvamVjdEluaXQ 注意&#xff1a;本文是逆向部分比较少&#xff0c;主要为了流程走通&#xff0c;限于代码搬运工。 第一步:分析页面 此网站经过请求响应&#xff0c;可以看出响应内容为加密内容。 第二步&#xff1a;判断加密类型 在XHR …

java.lang.NumberFormatException: For input string:

创建SpringBoot&#xff0c;Mybatis的项目时候&#xff0c;Service层调用Mapper层时候爆出了一个错误 发现报错是一个类型转换错误&#xff0c;经过排查后发现是因为mapper接收的实体类中没有写空参构造

Redis 中 List 数据结构详解

目录 List 用法 1. 增 2. 删 3. 查 内部编码 应用场景 前言 Redis 中的 List 和 Set 数据结构各有特点&#xff0c;适用于不同的应用场景。List 提供了有序的列表结构&#xff0c;适合用于消息队列和任务列表等场景&#xff1b;Set 提供了无序且不重复的集合结构&#…