19-备忘录(Memento)

本文深入探讨了备忘录设计模式,介绍了其定义、适用场景及实现方式。备忘录模式能在不破坏对象封装性的情况下,保存和恢复对象状态,适用于需要记录对象历史状态的应用场景。

1. 定义

在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。

2. 适用场景

  • 在软件构建过程中,某些对象的状态在转换过程中,可能由于某种需要,要求程序能够回溯到对象之前处于某个点时的状态。如果使用一些公有接口来让其他对象得到对象的状态,便会暴露对象的细节实现。
  • 如何实现对象状态的良好保存与恢复?但同时又不会因此而破坏对象本身的封装性。

3. 要点总结

  • 备忘录.(Memento)存储原发器( Originator )对象的内部状态,在需要时恢复原发器状态。
  • Memento模式的核心是信息隐藏,即Oriqinator需要向外接隐藏信息,保持其封装性。但同时又需要将状态保持到外界( Memento )。
  • 由于现代语言运行时(如C#、Java等)都具有相当的对象序列化支持,因此往往而用效率较高、又较容易正确实现的序列化方案来实现Memento模式。

4. Demo

class Memento
{
    string state;
    //..
public:
    Memento(const string & s) : state(s) {}
    string getState() const { return state; }
    void setState(const string & s) { state = s; }
};

class Originator
{
    string state;
    //....
public:
    Originator() {}
    Memento createMomento() {
        Memento m(state);
        return m;
    }
    void setMomento(const Memento & m) {
        state = m.getState();
    }
};

int main()
{
    Originator orginator;
    
    //捕获对象状态,存储到备忘录
    Memento mem = orginator.createMomento();
    
    //... 改变orginator状态
    
    //从备忘录中恢复
    orginator.setMomento(memento);  
}

本专栏文章:

<think>我们正在设计一个本地备忘录系统的数据流程图(Data Flow Diagram, DFD)。根据之前的讨论,我们需要绘制一个详细的DFD,使用Mermaid格式。下面将按照步骤进行: 1. **定义系统边界**: - 外部实体:普通用户(User) - 系统范围:用户认证、备忘录管理(创建、查看、编辑、删除)、公告管理(管理员)、班级管理(可选,根据引用[3]的数据库设计) 2. **识别核心处理过程**(一级细化): - 用户认证(User Authentication) - 备忘录管理(Memo Management) - 公告管理(Notice Management) - 班级管理(Class Management)[可选] 3. **数据存储**(根据引用[3]的数据库设计): - 用户表(User Table) - 备忘录表(Memo Table) - 公告表(Notice Table) - 班级成员表(ClassMember Table) 4. **数据流**: - 用户输入:账户、密码、备忘录内容、公告内容等 - 系统输出:验证结果、备忘录列表、公告通知、操作结果等 考虑到引用[3]中提到了备忘录模式(Memento Pattern),但在数据流程图中,我们主要关注数据流,而不是设计模式。因此,我们按照传统的数据流程图来绘制。 我们将绘制两个层级的DFD: - 顶层图(Level 0):显示系统与外部实体的交互 - 一级细化图(Level 1):显示系统内部的主要处理过程和数据存储 由于用户要求使用Mermaid格式,我们将用Mermaid的流程图语法来绘制。注意:Mermaid没有专门为DFD设计的符号,但我们可以用以下约定: - 矩形:外部实体(在Mermaid中可以用方括号表示) - 圆角矩形:处理过程(在Mermaid中用圆括号表示) - 圆柱形:数据存储(在Mermaid中用方括号加括号表示,如`[(Database)]`) - 箭头:数据流 但是,标准的Mermaid流程图并不区分外部实体和数据存储的图形,所以我们可以用标签来区分。 下面分别绘制两个层级的DFD: ### 顶层图(Level 0) 显示系统与外部实体的交互。 ```mermaid graph LR A[用户] -- 登录请求(账户/密码) --> B[本地备忘录系统] A -- 备忘录操作(创建/查看/编辑/删除) --> B A -- 公告查看 --> B B -- 登录结果(成功/失败) --> A B -- 备忘录列表 --> A B -- 公告通知 --> A ``` ### 一级细化图(Level 1) 显示系统内部的主要处理过程和数据存储。 ```mermaid graph TD A[用户] -->|账户/密码| P1[用户认证] P1 -->|验证成功| P2[备忘录管理] P1 -->|验证失败| A1[显示错误信息] A1 --> A P2 -->|创建备忘录| D2[(备忘录)] P2 -->|读取备忘录| D2 P2 -->|更新备忘录| D2 P2 -->|删除备忘录| D2 D2 -->|返回数据| P2 P2 -->|显示结果| A A -->|公告查看请求| P3[公告管理] P3 -->|读取公告| D3[(公告表)] D3 -->|返回公告| P3 P3 -->|显示公告| A %% 如果是管理员,还可以发布公告 A -->|发布公告请求| P3 P3 -->|权限验证| P1 P1 -->|验证管理员权限| P3 P3 -->|保存公告| D3 ``` 注意:在公告管理中,发布公告需要管理员权限,因此需要从用户认证中验证权限。 ### 关于班级管理 根据引用[3],系统可能包含班级管理功能。如果包含,我们可以增加一个处理过程: ```mermaid graph TD ... 其他部分同上 ... A -->|班级管理请求| P4[班级管理] P4 -->|权限验证| P1 P1 -->|验证权限| P4 P4 -->|添加/删除成员| D4[(班级成员表)] D4 -->|返回数据| P4 P4 -->|显示班级成员| A ``` ### 完整的一级细化图(包含班级管理) ```mermaid graph TD A[用户] -->|账户/密码| P1[用户认证] P1 -->|验证成功| P2[备忘录管理] P1 -->|验证失败| A1[显示错误信息] A1 --> A P2 -->|创建备忘录| D2[(备忘录)] P2 -->|读取备忘录| D2 P2 -->|更新备忘录| D2 P2 -->|删除备忘录| D2 D2 -->|返回数据| P2 P2 -->|显示结果| A A -->|公告查看请求| P3[公告管理] P3 -->|读取公告| D3[(公告表)] D3 -->|返回公告| P3 P3 -->|显示公告| A %% 发布公告流程 A -->|发布公告请求| P3 P3 -->|权限验证| P1 P1 -->|验证管理员权限| P3 P3 -->|保存公告| D3 %% 班级管理 A -->|班级管理请求| P4[班级管理] P4 -->|权限验证| P1 P1 -->|验证权限| P4 P4 -->|添加/删除成员| D4[(班级成员表)] D4 -->|返回数据| P4 P4 -->|显示班级成员| A ``` ### 说明 - 用户认证(P1)负责验证用户身份,并返回验证结果(成功或失败)。如果成功,用户可以进行后续操作。 - 备忘录管理(P2)负责处理备忘录的增删改查,操作备忘录表(D2)。 - 公告管理(P3)负责公告的发布(管理员)和查看(所有用户),操作公告表(D3)。 - 班级管理(P4)负责班级成员的添加和删除,操作班级成员表(D4)。 注意:在数据流程图中,我们只展示数据流,不展示控制流(比如错误处理分支可以简化)。上面的图表中,我们展示了主要的成功流程,对于错误流程(如权限不足)可以简单以返回错误信息表示。 ### 相关问题 §§相关问题§§ 1. 数据流程图中如何处理错误流程和异常情况? 2. 如何确保数据流程图与数据库设计(E-R图)的一致性? 3. 在多用户环境下,数据流程图需要考虑哪些并发问题? 4. 如何将备忘录设计模式Memento Pattern)应用到本地备忘录系统中? 5. 使用Mermaid绘制数据流程图有哪些限制?是否有更好的工具或方法?</think>以下是根据您的要求,使用Mermaid语法绘制的本地备忘录系统详细数据流程图,包含完整的数据流、处理过程、存储和权限控制: ### 本地备忘录系统数据流程图 (Mermaid格式) ```mermaid graph TD %% ===== 外部实体 ===== U[普通用户]:::entity A[管理员]:::entity %% ===== 核心处理过程 ===== subgraph 本地备忘录系统 P1[用户认证]:::process P2[备忘录管理]:::process P3[公告管理]:::process P4[班级管理]:::process %% ===== 数据存储 ===== D1[(用户表)]:::storage D2[(备忘录)]:::storage D3[(公告表)]:::storage D4[(班级成员表)]:::storage end %% ===== 用户认证流程 ===== U -->|1. 账户/密码| P1 P1 -->|2. 查询用户| D1 D1 -->|3. 验证结果| P1 P1 -->|4. 成功: 会话ID| U P1 -->|5. 失败: 错误码| U %% ===== 备忘录管理流程 ===== U -->|6. 创建: 标题+内容| P2 P2 -->|7. 生成ID+日期| P2 P2 -->|8. 保存数据| D2 D2 -->|9. 存储状态| P2 P2 -->|10. 操作结果| U U -->|11. 查询请求| P2 P2 -->|12. 读取数据| D2 D2 -->|13. 备忘录列表| P2 P2 -->|14. 格式化展示| U U -->|15. 删除ID| P2 P2 -->|16. 权限验证| D1 D1 -->|17. 权限结果| P2 P2 -->|18. 删除记录| D2 D2 -->|19. 删除状态| P2 %% ===== 公告管理流程 ===== A -->|20. 发布公告| P3 P3 -->|21. 权限验证| D1 D1 -->|22. 管理员权限| P3 P3 -->|23. 保存公告| D3 D3 -->|24. 存储状态| P3 P3 -->|25. 推送公告| U %% ===== 班级管理流程 ===== U -->|26. 班级操作请求| P4 P4 -->|27. 验证成员关系| D4 D4 -->|28. 成员状态| P4 P4 -->|29. 更新成员表| D4 D4 -->|30. 操作结果| P4 P4 -->|31. 班级列表| U %% ===== 样式定义 ===== classDef entity fill:#f9f,stroke:#333,stroke-width:2px; classDef process fill:#bbf,stroke:#333,stroke-width:2px,color:#000; classDef storage fill:#6cf,stroke:#333,stroke-width:2px,color:#000; ``` ### 流程图说明 1. **外部实体**(紫色): - 普通用户:执行备忘录操作 - 管理员:发布公告 2. **处理过程**(蓝色): - `用户认证`:验证账户/密码(引用[3]的备忘录状态验证原理) - `备忘录管理`:处理增删改查操作 - `公告管理`:带权限控制的公告发布 - `班级管理`:处理班级成员关系(引用[3]的类关系设计) 3. **数据存储**(天蓝色): - 用户表:存储账户/权限(字段:用户ID、密码、权限等级) - 备忘录表:存储核心数据(字段:ID、标题、内容、创建日期) - 公告表:存储管理员发布的公告 - 班级成员表:存储班级-用户关系(引用[3]的类结构) 4. **关键数据流**: - 权限验证流:`16→17`和`21→22`实现管理员控制 - 状态反馈流:所有操作都有结果返回(如`10,14,19,25,31`) - 数据完整性流:`8→9`和`23→24`确保存储成功后才反馈 - 错误处理流:`5`显示登录错误,`17`处理权限不足 ### 技术细节说明 1. **权限控制**: - 管理员操作需二次验证(流`21→22`) - 删除备忘录需验证用户权限(流`16→17`) - 基于引用[3]的类权限设计实现 2. **数据完整性**: - 所有存储操作都有状态返回(流`9,19,24`) - 备忘录创建自动生成ID和日期(流`7`) - 班级操作需验证成员关系(流`27→28`) 3. **错误处理**: - 登录失败返回错误码(流`5`) - 权限不足中断操作(流`17`) - 采用引用[1]的无感错误处理机制 4. **并发控制**: - 数据存储操作使用原子事务 - 基于引用[3]的备忘录状态管理原理 > 此图完整覆盖系统所有关键流程,可直接粘贴到支持Mermaid的工具(如VS Code插件、Draw.io或优快云编辑器[^1])中渲染使用。班级管理模块可根据需要启用或禁用。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逍遥俊子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值