中介模式实现聊天室

中介者模式的核心逻辑就是解耦对象‘多对多’的相互依赖关系。当遇到一大堆混乱的对象呈现“网状结构”,利用通过中介者模式解耦对象之间的通讯。

代码案例

抽象中介类

public abstract class AbstractChatRoom {public abstract void notice(String message , User user); //声明notice方法public abstract void register(User user);
}

实现中介类

package com.example.dyc.mymedia;import java.util.ArrayList;
import java.util.List;public class ChatRoom extends AbstractChatRoom {  //继承AbstractChatRoompublic List<User> users = new ArrayList<>();  //声明列表类存储User@Overridepublic void register(User user){   //登录添加用户users.add(user);}@Overridepublic void notice(String message,User user){  //notice方法的重写for(User u : users){   //遍历if(u != user){u.getMessage(message);}}}
}

User

package com.example.dyc.mymedia;public abstract class User {   //抽象类protected AbstractChatRoom chatRoom;  //聊天室对象public User(AbstractChatRoom chatRoom){this.chatRoom = chatRoom;this.chatRoom.register(this);}public abstract void sendMessage(String msg);  //声明发送消息的方法public abstract void getMessage(String msg);   //声明接收消息的方法
}

UserA:

package com.example.dyc.mymedia;//UserA
public class UserA extends User {private String userId;public UserA(String userId, AbstractChatRoom chatRoom) {super(chatRoom);this.userId = userId;}@Overridepublic void sendMessage(String msg){System.out.println(userId + "发送 "+msg);chatRoom.notice(msg,this);}@Overridepublic void getMessage(String msg){System.out.println(userId + "收到 "+msg );}
}

客户端

public class MyTest {public static void main(String[] args) {ChatRoom chatRoom = new ChatRoom();UserA userLi = new UserA("小李", chatRoom);UserA userWa = new UserA("小娃", chatRoom);userLi.sendMessage("我是小李");System.out.println("===================");userWa.sendMessage("我是小娃");}
}

参考资料:

Java-设计模式(中介模式实现聊天室)_使用设计模式实现聊天室要求真实实现-CSDN博客

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

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

相关文章

计网期末复习指南(六):应用层(DNS、FTP、URL、HTTP、SMTP、POP3)

前言&#xff1a;本系列文章旨在通过TCP/IP协议簇自下而上的梳理大致的知识点&#xff0c;从计算机网络体系结构出发到应用层&#xff0c;每一个协议层通过一篇文章进行总结&#xff0c;本系列正在持续更新中... 计网期末复习指南&#xff08;一&#xff09;&#xff1a;计算…

Java18+​App端采用uniapp+开发工具 idea hbuilder智能上门家政系统源码,一站式家政服务平台开发家政服务

Java18​App端采用uniapp开发工具 idea hbuilder智能上门家政系统源码&#xff0c;一站式家政服务平台开发 家政服务 家政服务是一个专为家政服务人员设计的平台&#xff0c;该平台旨在提供便捷、高效的工作机会&#xff0c;同时确保服务质量和客户体验。 以下是关于家政服务师…

python入门1

文章目录 前言一、python概述1、下载和安装2、python基础2.1 变量2.2 数据类型2.3Python中的注释2.4 运算符2.5 数值类型标准类型函数2.6 I/O操作 二、字符串1、字符串操作2、字符串内建函数3、格式化字符串3.1 在字符串中使用变量3.2 format()方法的基本使用 三、列表与元组1、…

鸿蒙工程目录介绍

鸿蒙构建完毕生成hhvp文件。 项目结构&#xff1a; .hvigor : 是存储构建配置文件的 .idea : 是开发工具拥有的目录 AppScope : 是全局的公共资源存放位置 hvigor &#xff1a;存放前端构建配置信息 oh_modules : 存放项目用到的第三方包 build-profile.json5 : 应用级别的构…

Mysql基础教程(15):别名

MySQL 别名 在本文中&#xff0c;我们讨论了 MySQL 中的列别名&#xff0c;表别名和派生表别名&#xff0c;以及使用别名来简化 SQL 和提高 SQL 的可读性。 如果在一个 SQL 中涉及到多个表&#xff0c;我们需要使用 table_name.column_name 这样的方式来引用每个表的字段&…

麒麟系统 安装xrdp 远程桌面方法记录

一、安装环境 麒麟V10 2107 ft2000 麒麟V10 2107 x86_64 二、安装准备 使用《Kylin-Desktop-V10-Release-2107-arm64.iso》镜像 做好U盘启动系统后&#xff0c;需要安装一个远程桌面工具&#xff0c;可以多用户在windows上使用远程桌面访问麒麟系统。 目前在linux系统上较…

做项目管理,有哪些证书值得考?

考证可以提升技能水平&#xff0c;增强职场竞争力。 01PMP认证 PMP是受全球认可的项目管理专业人士资格认证&#xff0c;在国际上具有权威性&#xff0c;被媒体公认为继MBA、MPA之后的三大就业金字招牌。 在国内认可度也很高&#xff0c;中石油、中国石化、中兴通讯等大型企…

使用目标检测模型YOLO V9 OBB进行旋转目标的检测:训练自己的数据集(基于卫星和无人机的农业大棚数据集)二

在网上看到别人在YOLO V9 源码上实现了旋转目标检测&#xff0c;但是我在按照他的方法进行训练的时候出现了错误提示&#xff0c;问题弄了很久都没有解决&#xff0c;欢迎各位大佬交流讨论给出建议 代码【免费】目标检测模型YOLOV9OBB资源-CSDN文库 运行训练脚本train.py提示如…

【Python】 Python装饰器的魔法:深入理解functools.wraps

基本原理 在Python中&#xff0c;装饰器是一种设计模式&#xff0c;用于修改或增强函数或方法的功能。functools.wraps是一个装饰器工厂&#xff0c;它用来帮助我们保持被装饰函数的元数据&#xff0c;比如函数的名字、文档字符串等。 当你创建一个装饰器时&#xff0c;你可能…

【mysql】ssl_choose_client_version:unsupported protocol

起因&#xff1a;项目上的DolphinScheduler连接不上数据库&#xff0c;查看worker日志提到SSL协议问题&#xff1a; com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failureCaused by: java.io.EOFException: SSL peer shut down incorrectly 我…

eNSP【综合实验】

综合实验配置 实验要求实验命令实验要求 1、设备名称修改。例如“交换机LSW1,修改为SW1”;“路由器AR1,即修改为AR1” 2、内网中的所有PC与网关互通。 要求:配置vlan基础部分,设置端口类型以及所允许通过的vlan,利用vlan的三层交换使得PC与网关互通。 PC1、PC2和Server1的…

什么牌子的无线领夹麦克风好?一文读懂领夹麦克风什么牌子好!

​无线领夹麦克风因其便携性和高音质而备受青睐。今天&#xff0c;我要为大家推荐几款备受赞誉的无线领夹麦克风&#xff0c;它们不仅在音质上表现出色&#xff0c;更在设计和性能上各有千秋。这些麦克风不仅适合专业录音师使用&#xff0c;也适合普通用户在日常生活中的各种场…

【LeetCode】42.接雨水

接雨水 题目描述&#xff1a; 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数…

某铁路信息中心运营监测项目

某铁路信息中心承担大量实时监测、例行巡检和排障维护等工作&#xff0c;为巩固信息化建设成果&#xff0c;提高整体运维效果&#xff0c;保障铁路信息系统稳定运行&#xff0c;需对现有网络监测系统进行升级改造。 设备类型&#xff1a;服务器、交换机、数据库、中间件、虚拟…

【数据结构】树与二叉树——二叉树的概念

二叉树的概念 导读一、二叉树的定义及其主要特性1.1 二叉树的定义1.2 二叉树的主要特性 二、特殊的二叉树2.1 满二叉树2.2 完全二叉树2.3 二叉排序树2.4 平衡二叉树 三、二叉树的性质3.1 性质一3.2 性质二3.3 性质三3.4 性质四3.5 性质五 结语 导读 大家好&#xff0c;很高兴又…

C# 生成解决方案时出现的一些异常及解决方法

一、ResolveAssemblyReference任务意外失败 在使用VS2022生成C#解决方案时&#xff0c;出现如下错误&#xff1a; 解决方法&#xff1a; 项目的依赖项出现问题&#xff0c;重新更新一下依赖项即可 二、生成Win32资源时出错 产生这个原因的主要原因是配置的应用程序的图标文…

04.docker的主要组成部分

docker体验 docker是传统的CS架构分为docker client和docker server,跟mysql一样 查看版本命令&#xff1a;docker version 查看docker下载的是社区版,ce代表社区 rpm -qa |grep docker 查看docker系统命令 docker system docker info&#xff08;如果要做监控&#xff…

黄仁勋的AI时代:英伟达GPU革命的狂欢与挑战

在最近的COMPUTEX 2024大会上&#xff0c;英伟达创始人黄仁勋发布了最新的Blackwell GPU。这次发布不仅标志着英伟达在AI领域的又一次飞跃&#xff0c;也展示了其对未来技术发展的战略规划。本文将详细解析英伟达最新技术的亮点&#xff0c;探讨其在AI时代的市场地位和未来挑战…

【UE5 刺客信条动态地面复刻】实现无界地面01:动态生成

2024.6.4更新 昨天半夜意识到生成Cube的方案不合适&#xff0c;又开始到处找动态地面的方法&#xff0c;发现了我想要的效果直接可以用nigara实现&#xff01;&#xff01;&#xff01;&#xff01; 于是这个部分就暂时告一段落&#xff0c;今季开始新的方向的学习。 为了快速…

thingsboard告警发送邮件的最新方式

ThingsBoard3.2及以上版本引入警报规则进行简化配置过程而无需通过规则引警进行配置只需要使用”Device Profile”即可&#xff0c;因为在以前的版本中需要一定的编程技巧才能完成。 新的报警发送邮件如下图流程&#xff0c;重点是增加customer details,配置Select details&am…