设计模式代码实战-中间者模式

server/2024/10/18 22:25:08/

1、问题描述

小明正在设计一个简单的多人聊天室系统,有多个用户和一个聊天室中介者,用户通过中介者进行聊天,请你帮他完成这个系统的设计。

输入示例
3
User1 User2 User3
User1 Hello_All!
User2 Hi_User1!
User3 How_is_everyone?

输出示例
User2 received: Hello_All!
User3 received: Hello_All!
User1 received: Hi_User1!
User3 received: Hi_User1!
User1 received: How_is_everyone?
User2 received: How_is_everyone?

2、中间者模式

作者认为的核心理念
中间者:持有所有代理,负责发送和接收代理的信息(包含两个方法)
代理:包含中间者引用,消息都是发送给中间者,中间者再掉用自己的发送信息方法
请添加图片描述

3、代码

import com.sun.java.accessibility.util.TopLevelWindowListener;import java.util.*;public class Main{public static void main(String[] args){Scanner sc=new Scanner(System.in);int number=sc.nextInt();sc.nextLine();Platform p=new QQ();String s=sc.nextLine();String[] names=s.split(" ");for(int i=0;i<number;i++){User u=new User(p,names[i]);p.register(u);p.register(u);}while(sc.hasNextLine()){String input=sc.nextLine();if(input.isEmpty()){break;}String[] inputs=input.split(" ");User u=p.getUser(inputs[0]);u.send(inputs[1]);}}
}interface Platform{void register(User u);void send(String message,User u);User getUser(String userName);
}class QQ implements Platform{private Map<String,User> hashMap;public QQ(){this.hashMap=new LinkedHashMap<>();}@Overridepublic void register(User u) {this.hashMap.put(u.getUserName(),u);}@Overridepublic void send(String message, User u) {for(User tmp:this.hashMap.values()){if(!tmp.getUserName().equals(u.getUserName())){tmp.receive(message);}}}@Overridepublic User getUser(String userName) {return hashMap.get(userName)==null?null:hashMap.get(userName);}
}interface Agent{void send(String message);void receive(String message);
}class User implements Agent{private Platform qq;private String name;public User(Platform p,String userName){this.qq=p;this.name=userName;}public String getUserName(){return this.name;}@Overridepublic void send(String message) {qq.send(message,this);}@Overridepublic void receive(String message) {System.out.println(this.name+" received: "+message);}
}

http://www.ppmy.cn/server/5589.html

相关文章

mpu6050姿态解算与卡尔曼滤波(5)可应用于51单片机的卡尔曼滤波器

博客4中给出的滤波器状态维数为4维&#xff0c;测量量为3维&#xff0c;每次滤波需要做不少矩阵乘法和求逆运算。如果想在51单片机上实现&#xff0c;计算耗时会比较长。考虑应用场合可以对滤波器适当做一些简化&#xff0c;计算量会大大减小。 首先&#xff0c;陀螺和加速度计…

pycharm创建的项目

pycharm生成django templates删出 settings.py

【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题

文章目录 一、什么是时间复杂度和空间复杂度&#xff1f;1.1 算法效率1.2 时间复杂度的概念1.3 空间复杂度的概念1.4 复杂度计算在算法中的意义 二、时间复杂度的计算2.1 大O渐进表示法2.2 常见时间复杂度计算举例 三、空间复杂度的计算四、Leetcode刷题1. 消失的数2. 旋转数组…

第23天:安全开发-PHP应用后台模块SessionCookieToken身份验证唯一性

第二十三天 一、PHP后台身份验证模块实现 二、Cookie&Session技术&差异 1.生成cookie的原理图过程&#xff1a;见上图 客户端向服务器发送HTTP请求。服务器检查请求头中是否包含cookie信息。如果请求头中包含cookie信息&#xff0c;则服务器使用该cookie来识别客户端…

用Python在PDF文档中插入单图像水印和平铺图像水印

PDF文档因其跨平台兼容性和内容保真度成为信息交换的标准载体&#xff0c;为应对版权侵犯、内容篡改以及未经授权的传播等风险&#xff0c;向PDF中插入图片水印成为一种强化文档安全性、彰显所有权及实施访问控制的有效手段。图片水印不仅能以直观的方式标示文档来源、强化版权…

面试(05)————Redis篇

目录 一、项目中哪些地方使用了redis 问题一&#xff1a;发生了缓存穿透该怎么解决&#xff1f; 方案一&#xff1a;缓存空数据 方案二&#xff1a;布隆过滤器 模拟面试 问题二&#xff1a; 发生了缓存击穿该怎么解决&#xff1f; 方案一&#xff1a;互斥锁 方案二&#xff…

小红书app缓存清除

1.背景 小伙伴们&#xff0c;手机app运行产生的缓存在不断侵占着我们的收集的内存&#xff0c;运行个半年发现内存不足20%。其实很多情况我们通过各个手机自带的缓存清除功能&#xff0c;就可以把app运行过程中产生的内存清除掉&#xff0c;节省我们不少的空间。想一想手机上a…

php ArrayAccess

class Foo implements ArrayAccess {public function offsetExists( $offset ) {echo "这里是 offsetExists() 方法 你输入的参数是 {$offset}";}public function offsetGet( $offset ) {echo "这里是 offsetGet() 方法 你输入的参数是 $offset";}public f…