软件工程学习日志2025.12.4

学习主题
中介者模式与备忘录模式的实践应用

学习目标

  1. 深入理解中介者模式和备忘录模式的设计动机、核心结构及适用场景;
  2. 能够运用中介者模式解决模块间解耦问题(以虚拟聊天室为例);
  3. 能够基于备忘录模式实现多次撤销功能(以用户信息操作为例);
  4. 规范编程风格,掌握模式在实际开发中的代码落地技巧。

学习内容与实践过程
一、中介者模式:虚拟聊天室实现

  1. 模式理解
    中介者模式的核心是通过一个“中介者”对象封装多个同事对象之间的交互,减少同事对象间的直接依赖,降低系统耦合度。在虚拟聊天室场景中,聊天室作为中介者,统一处理用户的消息发送逻辑,用户无需直接交互,只需与聊天室通信。

  2. 实验任务拆解
    新增带限制的具体聊天室(图片≤20M、文本≤100字符);
    新增高级会员类,发送文本时自动添加时间戳;
    保持原有系统兼容性,修改客户端进行测试。

  3. 实践步骤
    类图设计:定义Mediator中介者接口,实现基础聊天室ChatRoomA和带限制聊天室ChatRoomB;抽象User类,派生普通会员NormalUser和高级会员AdvancedUser,类间通过依赖关系解耦。
    代码实现:

  4. 编写Mediator接口,定义sendTextsendImage方法;

  5. 实现ChatRoomB的限制逻辑,通过常量定义最大文本长度和图片大小,发送前进行校验;

  6. 重写AdvancedUsersendText方法,使用SimpleDateFormat添加时间戳;

  7. 客户端创建不同聊天室和用户,测试消息发送的限制效果与时间戳功能。
    测试结果:聊天室B成功拦截超长文本和超大图片,高级会员消息自动附带时间戳,原有聊天室A无限制功能正常,符合实验要求。

二、备忘录模式:多次撤销功能实现

  1. 模式理解
    备忘录模式用于捕获对象的内部状态并保存,以便后续恢复。核心角色包括原发器(Originator,维护状态)、备忘录(Memento,存储状态)、负责人(Caretaker,管理备忘录)。本次实验通过集合存储多个备忘录,实现多次撤销。

  2. 实验任务拆解
    改进用户信息操作撤销功能,支持多次撤销,使用集合数据结构管理备忘录。

  3. 实践步骤
    类图设计:UserState存储用户状态,Memento封装状态,Originator创建和恢复备忘录,Caretaker通过ArrayList存储备忘录并维护当前索引。
    代码实现:

  4. UserState封装用户名、年龄、邮箱等状态属性,提供toString方便打印;

  5. Caretaker通过currentIndex记录当前操作位置,添加备忘录时清除后续无效状态,避免撤销后操作的状态混乱;

  6. 实现canUndo方法判断是否可撤销,undo方法返回上一个备忘录;

  7. 客户端模拟三次状态修改,测试两次撤销(恢复到上一状态)和边界情况(无法继续撤销)。
    测试结果:成功实现多次撤销,能准确恢复到历史状态,边界判断有效,无状态混乱问题。

遇到的问题及解决方法

  1. 中介者模式中,高级会员时间戳格式混乱:初始未处理日期格式化的线程安全问题,后来使用局部变量SimpleDateFormat,避免多线程下的格式错误。
  2. 备忘录模式中,撤销后新增状态导致历史记录异常:在CaretakeraddMemento方法中,清除当前索引后的备忘录,确保新增状态后,之前的撤销记录仅保留到当前操作。
  3. 类间依赖关系模糊:通过绘制Mermaid类图梳理角色关系,明确接口与实现类、父类与子类的继承/依赖关系,减少代码冗余。

学习总结

  1. 中介者模式适合多个对象交互频繁的场景,如聊天室、电商订单系统,通过中介者集中管理逻辑,便于后续扩展(如新增聊天室类型、用户类型);
  2. 备忘录模式的关键是备忘录的封装性,避免外部直接访问状态,负责人仅负责管理,不操作状态内容,确保数据安全;
  3. 编程规范方面,常量命名使用大写下划线,类结构清晰,注释完整,接口定义职责单一,提升代码可读性和可维护性;
  4. 本次实践让我深刻理解“设计模式是解决特定问题的最佳实践”,后续需结合更多实际场景,灵活选择合适的设计模式,降低系统耦合,提升扩展性。
posted @ 2025-12-04 22:55  仙人兵马俑  阅读(6)  评论(0)    收藏  举报