当前位置: 首页 > news >正文

中介模式实现聊天室

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

代码案例

抽象中介类

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.lryc.cn/news/362395.html

相关文章:

  • 游戏开发与游戏设计区别
  • 卡尔曼滤波算法的matlab实现
  • Unity Obi Rope失效
  • 基于Nginx和Consul构建自动发现的Docker服务架构——非常之详细
  • Gnu/Linux 系统编程 - 如何获取帮助及一个演示
  • ffmpeg 的sws_scale接口函数解析
  • MoonBit 本周新增类型标注语法、继续进行核心库 API 整理工作
  • YOLOv10训练自己的数据集
  • 探索Web前端三大主流框架:Angular、React和Vue.js
  • 《HelloGitHub》第 98 期
  • Xtransfer面试内容
  • 论文笔记:Image Anaimation经典论文-运动关键点模型(Monkey-Net)
  • Kibana创建ElasticSearch 用户角色
  • Vue基础(2)响应式基础
  • Mysql基础教程(15):别名
  • SpringCloud 微服务中网关如何记录请求响应日志?
  • 【运维项目经历|028】Cobbler自动化部署平台构建项目
  • “物联网安全:万物互联背景下的隐私保护与数据安全策略“
  • LeetCode216组合总和3
  • 微软找腾讯接盘,Windows直接安装手机APP体验起飞了
  • 【Springcloud微服务】MybatisPlus下篇
  • i18n-demo
  • [Leetcode] 0-1背包和完全背包
  • 自定义类型:联合体和枚举
  • 【Cityengine】Cityengine生产带纹理的建筑模型导入UE4/UE5(下)
  • 详解51种企业应用架构模式
  • 【十年java搬砖路】Jumpserver docker版安装及配置Ldap登陆认证
  • C\C++内存管理(未完结)
  • 一个小时搞定JAVA面向对象(5)——抽象与接口
  • 图像关键特征描述方法-小目标