11.29(1)

news/2025/11/29 23:44:22/文章来源:https://www.cnblogs.com/cyy1811068002/p/19287770

补11.28
1.类图
┌─────────────────┐
│ AbstractChatRoom │
├─────────────────┤
│ +register() │
│ +sendText() │
│ +sendImage() │
└─────────────────┘


┌───────────┐
│CommonChatRoom│
│StrictChatRoom│
└───────────┘


┌─────────────────┐
│ Member │
├─────────────────┤
│ +sendText() │
│ +sendImage() │
└─────────────────┘


┌───────────┐
│ DiamondMember │
└───────────┘
2.源代码
import java.text.SimpleDateFormat;
import java.util.*;

/**

  • 虚拟聊天室系统 - 中介者模式实现
  • 包含普通聊天室、严格聊天室、普通会员和钻石会员
    */

// 抽象中介者 - 聊天室
abstract class AbstractChatRoom {
protected Map<String, Member> members = new HashMap<>();

// 注册会员
public void register(Member member) {if (!members.containsKey(member.getName())) {members.put(member.getName(), member);member.setChatRoom(this);System.out.println("【系统】" + member.getName() + " 加入聊天室");}
}// 发送文本消息
public abstract void sendText(String from, String to, String message);// 发送图片消息
public abstract void sendImage(String from, String to, String imageName, int imageSize);// 广播文本消息
public abstract void broadcastText(String from, String message);// 广播图片消息
public abstract void broadcastImage(String from, String imageName, int imageSize);// 获取在线会员列表
public List<String> getOnlineMembers() {return new ArrayList<>(members.keySet());
}

}

// 普通聊天室
class CommonChatRoom extends AbstractChatRoom {
@Override
public void sendText(String from, String to, String message) {
Member member = members.get(to);
if (member != null) {
System.out.println("【私聊】" + from + " -> " + to + ": " + message);
member.receiveText(from, message);
} else {
System.out.println("【系统】用户 " + to + " 不存在!");
}
}

@Override
public void sendImage(String from, String to, String imageName, int imageSize) {Member member = members.get(to);if (member != null) {System.out.println("【图片】" + from + " -> " + to + ": " + imageName + " (" + imageSize + "M)");member.receiveImage(from, imageName, imageSize);} else {System.out.println("【系统】用户 " + to + " 不存在!");}
}@Override
public void broadcastText(String from, String message) {System.out.println("【广播】" + from + ": " + message);for (Member member : members.values()) {if (!member.getName().equals(from)) {member.receiveText(from, message);}}
}@Override
public void broadcastImage(String from, String imageName, int imageSize) {System.out.println("【广播图片】" + from + ": " + imageName + " (" + imageSize + "M)");for (Member member : members.values()) {if (!member.getName().equals(from)) {member.receiveImage(from, imageName, imageSize);}}
}

}

// 严格聊天室 - 新的具体聊天室类
class StrictChatRoom extends AbstractChatRoom {
private static final int MAX_IMAGE_SIZE = 20; // 图片大小限制20M
private static final int MAX_TEXT_LENGTH = 100; // 文本长度限制100字符

@Override
public void sendText(String from, String to, String message) {// 检查文本长度if (message.length() > MAX_TEXT_LENGTH) {System.out.println("【系统错误】文本长度不能超过 " + MAX_TEXT_LENGTH + " 个字符");return;}Member member = members.get(to);if (member != null) {System.out.println("【严格私聊】" + from + " -> " + to + ": " + message);member.receiveText(from, message);} else {System.out.println("【系统】用户 " + to + " 不存在!");}
}@Override
public void sendImage(String from, String to, String imageName, int imageSize) {// 检查图片大小if (imageSize > MAX_IMAGE_SIZE) {System.out.println("【系统错误】图片大小不能超过 " + MAX_IMAGE_SIZE + "M");return;}Member member = members.get(to);if (member != null) {System.out.println("【严格图片】" + from + " -> " + to + ": " + imageName + " (" + imageSize + "M)");member.receiveImage(from, imageName, imageSize);} else {System.out.println("【系统】用户 " + to + " 不存在!");}
}@Override
public void broadcastText(String from, String message) {// 检查文本长度if (message.length() > MAX_TEXT_LENGTH) {System.out.println("【系统错误】文本长度不能超过 " + MAX_TEXT_LENGTH + " 个字符");return;}System.out.println("【严格广播】" + from + ": " + message);for (Member member : members.values()) {if (!member.getName().equals(from)) {member.receiveText(from, message);}}
}@Override
public void broadcastImage(String from, String imageName, int imageSize) {// 检查图片大小if (imageSize > MAX_IMAGE_SIZE) {System.out.println("【系统错误】图片大小不能超过 " + MAX_IMAGE_SIZE + "M");return;}System.out.println("【严格广播图片】" + from + ": " + imageName + " (" + imageSize + "M)");for (Member member : members.values()) {if (!member.getName().equals(from)) {member.receiveImage(from, imageName, imageSize);}}
}

}

// 抽象同事类 - 会员
abstract class Member {
protected String name;
protected AbstractChatRoom chatRoom;

public Member(String name) {this.name = name;
}public String getName() {return name;
}public void setChatRoom(AbstractChatRoom chatRoom) {this.chatRoom = chatRoom;
}// 发送文本消息
public abstract void sendText(String to, String message);// 发送图片消息
public abstract void sendImage(String to, String imageName, int imageSize);// 接收文本消息
public abstract void receiveText(String from, String message);// 接收图片消息
public abstract void receiveImage(String from, String imageName, int imageSize);// 广播文本消息
public void broadcastText(String message) {if (chatRoom != null) {chatRoom.broadcastText(name, message);}
}// 广播图片消息
public void broadcastImage(String imageName, int imageSize) {if (chatRoom != null) {chatRoom.broadcastImage(name, imageName, imageSize);}
}

}

// 普通会员
class CommonMember extends Member {
public CommonMember(String name) {
super(name);
}

@Override
public void sendText(String to, String message) {if (chatRoom != null) {chatRoom.sendText(name, to, message);}
}@Override
public void sendImage(String to, String imageName, int imageSize) {if (chatRoom != null) {chatRoom.sendImage(name, to, imageName, imageSize);}
}@Override
public void receiveText(String from, String message) {System.out.println("【接收】" + name + " 收到来自 " + from + " 的消息: " + message);
}@Override
public void receiveImage(String from, String imageName, int imageSize) {System.out.println("【接收图片】" + name + " 收到来自 " + from + " 的图片: " + imageName + " (" + imageSize + "M)");
}

}

// 钻石会员 - 新的具体会员类
class DiamondMember extends Member {
private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

public DiamondMember(String name) {super(name);
}@Override
public void sendText(String to, String message) {if (chatRoom != null) {// 在信息后加上时间String messageWithTime = message + " [发送时间: " + dateFormat.format(new Date()) + "]";chatRoom.sendText(name, to, messageWithTime);}
}@Override
public void sendImage(String to, String imageName, int imageSize) {if (chatRoom != null) {chatRoom.sendImage(name, to, imageName, imageSize);}
}@Override
public void receiveText(String from, String message) {System.out.println("【钻石接收】" + name + " 收到来自 " + from + " 的消息: " + message);
}@Override
public void receiveImage(String from, String imageName, int imageSize) {System.out.println("【钻石接收图片】" + name + " 收到来自 " + from + " 的图片: " + imageName + " (" + imageSize + "M) [接收时间: " + dateFormat.format(new Date()) + "]");
}// 钻石会员特有方法 - 发送带时间的广播
public void broadcastTextWithTime(String message) {String messageWithTime = message + " [广播时间: " + dateFormat.format(new Date()) + "]";broadcastText(messageWithTime);
}

}

// 客户端测试类
public class ChatRoomSystem {
public static void main(String[] args) {
System.out.println("=== 虚拟聊天室系统测试 ===\n");

    // 创建聊天室AbstractChatRoom commonRoom = new CommonChatRoom();AbstractChatRoom strictRoom = new StrictChatRoom();// 创建会员Member member1 = new CommonMember("张三");Member member2 = new CommonMember("李四");Member member3 = new DiamondMember("王五");Member member4 = new DiamondMember("赵六");System.out.println("\n=== 测试普通聊天室 ===");// 注册到普通聊天室commonRoom.register(member1);commonRoom.register(member2);commonRoom.register(member3);// 测试普通聊天室功能member1.sendText("李四", "你好,李四!这是一条普通消息。");member2.sendImage("张三", "风景.jpg", 15);member3.broadcastText("大家好,我是钻石会员王五!");System.out.println("\n=== 测试严格聊天室 ===");// 注册到严格聊天室strictRoom.register(member3);strictRoom.register(member4);// 测试严格聊天室限制功能member3.sendText("赵六", "这是一条正常长度的文本消息。");member4.sendText("王五", "这是一条非常长的文本消息,这条消息的长度已经超过了100个字符的限制,应该会被系统拒绝发送。这条消息确实太长了!");member3.sendImage("赵六", "小图片.png", 10);member4.sendImage("王五", "大图片.jpg", 25);System.out.println("\n=== 测试钻石会员特色功能 ===");// 测试钻石会员的时间戳功能DiamondMember diamondMember = (DiamondMember) member3;diamondMember.sendText("赵六", "这是带时间戳的私聊消息");diamondMember.broadcastTextWithTime("这是带时间戳的广播消息");System.out.println("\n=== 测试在线会员列表 ===");System.out.println("普通聊天室在线会员: " + commonRoom.getOnlineMembers());System.out.println("严格聊天室在线会员: " + strictRoom.getOnlineMembers());System.out.println("\n=== 测试完成 ===");
}

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

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

相关文章

251129我的效率为何如此之低

是不是我关注和摄入的东西太多了,应该简单一些吧。 而且我好像,,,,不能沉下心来工作,就是总想选择一些安逸的东西。一会儿就想去看看别的,啊,死脑子快控制住自己啊啊!! 想尝试一下毛巾胶 最近老是退货,88vi…

20232324 2025-2026-2 《网络与系统攻防技术》实验八实验报告

20232324 2025-2026-2 《网络与系统攻防技术》实验八实验报告1.实验内容(1)Web前端HTML 能正常安装、启停Apache。理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML。 (2)Web前端javascipt理解Java…

11月第一篇笔记

书中对“代码复用”的解读彻底点醒了我:复用不是简单的复制粘贴,而是构建“可复用的知识模块”。作者提到,优秀的开发者会像搭建积木一样积累可复用组件,既节省时间又减少错误。这让我反思,要是实训前小组能先梳理…

C++自学之路1:Hello world

C++ 语法基础 本文主要通过Hello world这样一个简单的c++程序来认识C++的基础语法框架 本文内容主要来自OI wiki #include <iostream> // 引用头文件int main() // 定义 main 函数 { s…

《代码大全》读后感四

《代码大全 2》最让我惊喜的是它的实用性。书中没有空洞的理论,而是用大量真实案例讲解 “如何写出易读的代码”。比如它提到 “函数长度控制在 20 行内”,我试着在项目中实践,发现后续修改时,能快速定位核心逻辑;…

k8s 笔记

好的,我们来详细整理一下关于 Kubernetes Endpoints 资源的笔记。这份笔记将严格按照你的大纲,并力求概念通俗易懂、案例详尽、代码完整且包含输出解释。Kubernetes Endpoints 资源深度解析 一、什么是 Endpoints 资…

11月第二篇笔记

“在动手编码前,先确保理解了问题本身”,书中这句忠告,是我在数据库课程设计中用返工代价换来的深刻教训。当时课程要求开发一个图书借阅管理系统,我拿到需求文档后,看到“实现图书借阅、归还功能”就立刻投入编码…

《代码大全》读后感五

时隔三年再读《代码大全 2》,我有了新的感悟。初读时,我只关注书中的技巧方法,如今却读懂了它背后的 “匠心”—— 对代码质量的极致追求,对开发效率的深度思考。它让我明白,编程不只是谋生的技能,更是需要用心打…

网安学习day x 天

抓包课程笔记 抓包工具: Burpcharles fiddler 转发工具: proxifier学习了web/安卓模拟器/wx小程序/pc应用的抓包 proxifier 建立代理服务器 设置代理规则:基于进程筛选 继续IP或域名筛选 基于端口筛选 app应用 安装证…

关于synchronized-reentrantlock-volatile学习总结1.0

Synchronized synchronized 是什么 synchronized是 java 提供的原子性内置锁,实现基本的同步机制,不支持超时,非公平,不可中断,不支持多条件,基于 JVM 的 Monitor(监视锁)机制实现,主要解决的是多个线程之间的…

nginx:普通用户使用80端口启动nginx报错,nginx: [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied)

nginx:普通用户使用80端口启动nginx报错,nginx: [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied)解释 在大多数Linux发行版中,端口80通常被配置为仅由root用户或具有相应权限的用户监听。 方式一:直接…

通过C语言实现文件加密和解密

这是一个很好的学习项目,希望有需要的小伙伴能从中获益。 一、核心思路 a2p1aDdmLmNvbQ== kjuh7f.coma2p1aDdmLmNvbQ== 文件加密的本质是:通过某种算法(加密算法)和密钥,将原始文件(明文)转换为不可读的乱码(密…

NOIP2025 赛后彻底自我反省

差不多把我打醒了。 100+20+0+0(极小概率T2 多eps分(没调完的代码)),不会是全校最低吧。 打的跟大便一样。 估计队线在200~240左右?场上历程 10分钟过了T1。 接下来开始看剩下三题,给我的感受是,T3神秘的树高…

易错点总结(含策略)

格式:出现的问题-导致的后果-改进方式 1.策略失误(总体问题)1.开题顺序问题 有时出现在模拟赛,正赛没有失误 后面得题目较为简单时候容易出现丢分问题 在每一次比赛前都提醒自己不要出现漏看题的问题2.无法正确评估…

CVE-2017-16894

CVE-2017-16894复现漏洞原理 在laravel框架的.env配置文件中,默认调试功能debug是开启的。当使程序报错时。在前台会返回报错详情、环境变量、服务器配置等敏感信息。 复现过程 使用burp抓包将GET修改为POST,并输入1=…

2025最新云南/昆明AI直播服务商推荐!云南本土科技企业权威榜单发布,资质技术双优助力企业数字化转型贤邦科技/云南AI直播公司推荐

引言 随着数字经济深度渗透,AI直播已成为企业数字化转型的核心引擎,尤其在云南特色产业推广中展现出强大价值。据中国信通院《2025人工智能产业白皮书》数据显示,西南地区AI直播市场规模年增速达47%,云南企业对本土…

2025 年杭州钱塘区摄影培训人像摄影培训推荐榜:路人贾摄影讲堂 全杭州10个区覆盖、人像摄影十杰创办

随着新媒体内容创作与商业摄影市场的持续火热,对于高品质人像摄影技能的需求激增。无论是希望成为职业摄影师,还是追求个人兴趣精进的摄影爱好者,选择一家师资力量雄厚、课程体系科学、实战经验丰富的培训机构,已成…

自主AI与前端开发自动化技术探讨

本期播客探讨了自主AI在前端网页开发中的自动化应用,人机交互界面发展,大型语言模型自我优化,职业替代问题,以及AI伦理和安全防护机制等技术话题。机器伦理播客:与Adir Ben-Yehuda探讨自主AI 主持人:Ben Byford …

2025年度云南/昆明企业数字化服务/人工智能服务商优选推荐——贤邦科技,深耕云南市场,短视频制作/短视频运营/AI数字/小程序开发/AI直播全栈解决

随着数字经济的蓬勃发展,企业数字化转型需求日益多元化,从短视频营销到AI技术应用,从软件开发到智能运营,选择专业可靠的服务伙伴成为企业突破发展瓶颈的关键。在2025年的云南数字化服务市场中,昆明贤邦科技有限公…

2025 年杭州富阳区摄影培训人像摄影培训推荐榜:路人贾摄影讲堂 全杭州10个区覆盖、人像摄影十杰创办

随着新媒体内容创作与商业摄影市场的持续火热,对于高品质人像摄影技能的需求激增。无论是希望成为职业摄影师,还是追求个人兴趣精进的摄影爱好者,选择一家师资力量雄厚、课程体系科学、实战经验丰富的培训机构,已成…