中介模式实现聊天室

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

代码案例

抽象中介类

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 {  //继承AbstractChatRoom

    public List<User> users = new ArrayList<>();  //声明列表类存储User

    @Override
    public void register(User user){   //登录添加用户
        users.add(user);
    }

    @Override
    public 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;
    }

    @Override
    public void sendMessage(String msg){
        System.out.println(userId + "发送 "+msg);
        chatRoom.notice(msg,this);
    }
    @Override
    public 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博客

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

复合材料数据整合与自动识别抽取系统

概述&#xff1a;为材料行业的研发提供自动化数据整合与识别抽取系统&#xff0c;以降低研发成本、提升效率并推动行业智能化转型。 客户背景 在复合材料行业中&#xff0c;信息的获取和整合是一个复杂且成本高昂的过程。由于该行业的数据分散在各种文献、报告、网站等渠道&am…

【Web API DOM02】如何获取、操作DOM元素

一&#xff1a;获取DOM元素 1 根据CSS选择器获取 语法格式如下&#xff1a; &#xff08;1&#xff09;选中一个DOM元素 document.querySeletor(CSS选择器) <ul><li>1</li><li>2</li><li>3</li> </ul> document.querySel…

对人脸图像进行性别和年龄的判断

判断性别和年龄 导入必要的库加载预训练的人脸检测模型加载预训练的性别和年龄识别模型定义性别和年龄的标签列表创建Tkinter窗口&#xff1a;定义选择图片的函数&#xff1a;创建一个按钮&#xff0c;用于打开文件选择对话框定义显示图片的函数创建预测性别和年龄的函数创建预…

员工转正申请精选12个模板供参考

随着社会在不断地进步&#xff0c;我们会经常使用各种各样的申请书&#xff0c;转正申请书就是申请书的一种&#xff0c;那么转正申请书是怎么写的呢&#xff1f;下面是我收集整理的员工转正申请书几个版本&#xff0c;仅供参考&#xff0c;希望能够帮助到大家。别忘了一键三连…

入门到实践,手把手教你用AI绘画!

前言 一款无需魔法的PS插件&#xff01;下载即用&#xff0c;自带提示词插件&#xff0c;无论你是小白还是大神都能轻松上手&#xff0c;无配置要求&#xff0c;win/mac通通能用&#xff01; AI绘画工具——StartAI 官网&#xff1a;StartAI官网 (istarry.com.cn) 近段时间…

Vue3+vite+Tailwindcss 构建自适应页面 暗黑 高亮 主题

资源tailwind css&#xff1a;Tailwind CSS Templates - Tailwind UITailwind CSS Templates - Tailwind UITailwind CSS Templates - Tailwind UI 1、安装tailwindcss npm install -D tailwindcss postcss autoprefixer2、安装配置&#xff1a; npx tailwindcss init -p 运…

Python使用trule库画小猪佩奇

在这篇博客中&#xff0c;我将向大家展示如何使用Python的Turtle模块来绘制一个可爱的小猪佩奇。这个项目不仅可以帮助你熟悉Turtle绘图&#xff0c;还可以让你在编程的过程中享受到绘画的乐趣。 并非百分百原创&#xff0c;有部分参考其他博主&#xff0c;请理性对待&#xff…

抖音小店怎么找厂家代发?从沟通到发货,全流程不容错过!

哈喽~ 我是电商月月 新手做抖音小店&#xff0c;无货源模式的商家不知道怎么找货源&#xff1f; 今天月月就给大家讲解一下抖音小店从找厂家&#xff0c;到和厂家沟通&#xff0c;最后协商发货的方法步骤都有哪些&#xff1f; 满满干货&#xff0c;不容错过&#xff0c;建议…

库卡机械手伺服电机过压报警维修措施

一、KUKA机械手伺服电机过压报警原因库卡机器人电机过压报警通常是由于电机供电电压过高、电机绕组短路、电机负载过大等原因引起的。当电机供电电压超过额定电压一定范围&#xff0c;或者电机绕组出现短路故障&#xff0c;或者电机负载过大导致电流过大时&#xff0c;电机电流…

头颈肿瘤在PET/CT中的分割:HECKTOR挑战赛| 文献速递-深度学习肿瘤自动分割

Title 题目 Head and neck tumor segmentation in PET/CT: The HECKTOR challenge 头颈肿瘤在PET/CT中的分割&#xff1a;HECKTOR挑战赛 01 文献速递介绍 高通量医学影像分析&#xff0c;常被称为放射组学&#xff0c;已显示出其在揭示定量影像生物标志物与癌症预后之间关…

Unity 自定义编辑器根据枚举值显示变量

public class Test : MonoBehaviour {[HideInInspector][Header("数量")][SerializeField]public int num;[Header("分布类型")][SerializeField]public DistributionType distType;[HideInInspector][Header("位置")][SerializeField]public Li…

LLaMA-Factory实战推理

LLaMA-Factory官网&#xff1a;https://github.com/hiyouga/LLaMA-Factory 安装环境 git clone https://github.com/hiyouga/LLaMA-Factory.git cd LLaMA-Factory/ conda create -n py310 python3.10 conda activate py310按照llama-factory要求的标准格式组织数据集&#xff…

汽车分销商文件流转优化:实现稳定高效的文件分发处理

在汽车圈里&#xff0c;分销商可是个不可或缺的角色。他们既要跟汽车厂家紧紧绑在一起&#xff0c;还得跟下游的销售渠道或者直接跟消费者打成一片&#xff0c;文件来回传递那是家常便饭。 这文件发放的速度快不快&#xff0c;安不安全&#xff0c;直接影响到分销商做事的效率…

收到“由于找不到emp.dll无法继续执行代码”错误提示时有什么解决办法?分享emp.dll丢失的修复方法

当你收到“由于找不到emp.dll无法继续执行代码”的错误时&#xff0c;意味着你想要运行的程序依赖于名为“emp.dll”的动态链接库&#xff08;DLL文件&#xff09;&#xff0c;但系统无法在指定的位置或默认搜索路径中找到这个文件。 emp.dll文件的详细介绍 emp.dll是一个重要…

vue3【实战】可撤销重做的 input 输入框

效果预览 实现思路 用 list 数组保存每次输入后输入框的值&#xff08;响应 input 事件&#xff09;用 indexRef 作为指针&#xff0c;指向当前 list 数组中对应当前输入框的值撤销时&#xff0c;指针左移重做时&#xff0c;指针右移输入时&#xff0c;对 list 数组按指针1做截…

(函数)分类统计字符串中不同类型的数量(C语言)

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>//声明分类统计函数&#xff1b; void statistics(char a[100]);int main() {//初始化变量值&#xff1b;char a[100] { 0 };//获取用户输入数据&#xff1b;pr…

电脑记事本怎么恢复之前的内容记录

每个人都曾有过这样的时刻——在记事本上精心记录下的重要内容&#xff0c;一不小心就被删除了。那种心情&#xff0c;仿佛一瞬间从山顶跌落到谷底&#xff0c;无尽的懊悔涌上心头。我也曾遭遇过这样的困境&#xff0c;那些消失的文字对我来说意义非凡&#xff0c;它们的丢失仿…

太速科技-基于XC7V690T的12路光纤PCIe接口卡

基于XC7V690T的12路光纤PCIe接口卡 一、板卡概述 基于XC7V690T的12路光纤PCI-E接口卡&#xff0c;用于实现多通道高速光纤数据接收和发送&#xff0c;板卡兼容PCIe 2.0和PCIe 3.0规范&#xff0c;利用PCI-E Switch PEX 8748实现FPGA芯片与计算机的通信&#xff0c;计算机与板…

数据分析常用模型合集(三)同期群、逻辑树、假设检验等

前面两篇文章&#xff0c;我们将比较大、较为系统的分析方法作了一个介绍&#xff0c;本文是最后一篇&#xff0c;将剩余的一些讲一讲。 剩下的一些模型&#xff0c;其实不应叫做模型&#xff0c;主要是一些分析的方法和思路&#xff0c;这些方法并不涵盖整个互联网行业的业务…

【LeetCode】二叉树oj专题

如有不懂的地方&#xff0c;可查阅往期相关文章&#xff01; 个人主页&#xff1a;小八哥向前冲~ 所属专栏&#xff1a;数据结构【c语言】 目录 单值二叉树 对称二叉树 计算二叉树的深度 二叉树的前序遍历 相同二叉树 另一棵树的子树 二叉树的构建和遍历 翻转二叉树 判…