软件工程学习日志2025.12.4
学习主题
中介者模式与备忘录模式的实践应用
学习目标
- 深入理解中介者模式和备忘录模式的设计动机、核心结构及适用场景;
- 能够运用中介者模式解决模块间解耦问题(以虚拟聊天室为例);
- 能够基于备忘录模式实现多次撤销功能(以用户信息操作为例);
- 规范编程风格,掌握模式在实际开发中的代码落地技巧。
学习内容与实践过程
一、中介者模式:虚拟聊天室实现
-
模式理解
中介者模式的核心是通过一个“中介者”对象封装多个同事对象之间的交互,减少同事对象间的直接依赖,降低系统耦合度。在虚拟聊天室场景中,聊天室作为中介者,统一处理用户的消息发送逻辑,用户无需直接交互,只需与聊天室通信。 -
实验任务拆解
新增带限制的具体聊天室(图片≤20M、文本≤100字符);
新增高级会员类,发送文本时自动添加时间戳;
保持原有系统兼容性,修改客户端进行测试。 -
实践步骤
类图设计:定义Mediator中介者接口,实现基础聊天室ChatRoomA和带限制聊天室ChatRoomB;抽象User类,派生普通会员NormalUser和高级会员AdvancedUser,类间通过依赖关系解耦。
代码实现: -
编写
Mediator接口,定义sendText和sendImage方法; -
实现
ChatRoomB的限制逻辑,通过常量定义最大文本长度和图片大小,发送前进行校验; -
重写
AdvancedUser的sendText方法,使用SimpleDateFormat添加时间戳; -
客户端创建不同聊天室和用户,测试消息发送的限制效果与时间戳功能。
测试结果:聊天室B成功拦截超长文本和超大图片,高级会员消息自动附带时间戳,原有聊天室A无限制功能正常,符合实验要求。
二、备忘录模式:多次撤销功能实现
-
模式理解
备忘录模式用于捕获对象的内部状态并保存,以便后续恢复。核心角色包括原发器(Originator,维护状态)、备忘录(Memento,存储状态)、负责人(Caretaker,管理备忘录)。本次实验通过集合存储多个备忘录,实现多次撤销。 -
实验任务拆解
改进用户信息操作撤销功能,支持多次撤销,使用集合数据结构管理备忘录。 -
实践步骤
类图设计:UserState存储用户状态,Memento封装状态,Originator创建和恢复备忘录,Caretaker通过ArrayList存储备忘录并维护当前索引。
代码实现: -
UserState封装用户名、年龄、邮箱等状态属性,提供toString方便打印; -
Caretaker通过currentIndex记录当前操作位置,添加备忘录时清除后续无效状态,避免撤销后操作的状态混乱; -
实现
canUndo方法判断是否可撤销,undo方法返回上一个备忘录; -
客户端模拟三次状态修改,测试两次撤销(恢复到上一状态)和边界情况(无法继续撤销)。
测试结果:成功实现多次撤销,能准确恢复到历史状态,边界判断有效,无状态混乱问题。
遇到的问题及解决方法
- 中介者模式中,高级会员时间戳格式混乱:初始未处理日期格式化的线程安全问题,后来使用局部变量
SimpleDateFormat,避免多线程下的格式错误。 - 备忘录模式中,撤销后新增状态导致历史记录异常:在
Caretaker的addMemento方法中,清除当前索引后的备忘录,确保新增状态后,之前的撤销记录仅保留到当前操作。 - 类间依赖关系模糊:通过绘制Mermaid类图梳理角色关系,明确接口与实现类、父类与子类的继承/依赖关系,减少代码冗余。
学习总结
- 中介者模式适合多个对象交互频繁的场景,如聊天室、电商订单系统,通过中介者集中管理逻辑,便于后续扩展(如新增聊天室类型、用户类型);
- 备忘录模式的关键是备忘录的封装性,避免外部直接访问状态,负责人仅负责管理,不操作状态内容,确保数据安全;
- 编程规范方面,常量命名使用大写下划线,类结构清晰,注释完整,接口定义职责单一,提升代码可读性和可维护性;
- 本次实践让我深刻理解“设计模式是解决特定问题的最佳实践”,后续需结合更多实际场景,灵活选择合适的设计模式,降低系统耦合,提升扩展性。

浙公网安备 33010602011771号