行为型 中等

备忘录模式

Memento Pattern

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

概述

备忘录模式是一种行为设计模式,允许在不暴露对象实现细节的情况下保存和恢复对象之前的状态。

适用场景

  • 当需要创建对象状态快照来恢复其之前的状态时
  • 当直接访问对象的成员变量、获取器或设置器将导致封装被突破时

优点

  • +可以在不破坏对象封装的情况下创建对象状态快照
  • +可以通过让负责人维护备忘录历史记录来简化原发器代码

缺点

  • 如果客户端过于频繁地创建备忘录,程序将消耗大量内存
  • 负责人必须完整跟踪原发器的生命周期,这样才能销毁弃用的备忘录

结构

classDiagram class Originator { -state: string +setState(state: string) +save(): Memento +restore(m: Memento) } class Memento { -state: string -date: Date +getState(): string +getDate(): Date } class Caretaker { -mementos: List~Memento~ -originator: Originator +backup() +undo() +showHistory() } class Client { +main() } Originator --> Memento : creates Caretaker o--> Memento : manages Caretaker --> Originator : uses Client ..> Caretaker : uses Client ..> Originator : uses style Originator fill:#e3f2fd,stroke:#1976d2,stroke-width:2px style Memento fill:#fff3e0,stroke:#f57c00,stroke-width:2px style Caretaker fill:#e8f5e9,stroke:#388e3c,stroke-width:2px style Client fill:#f5f5f5,stroke:#616161,stroke-width:1px

交互演示

捕获和恢复对象状态
OriginatorTextEditor
"Hello"
备忘录历史

编辑内容后保存状态,可以随时恢复到之前的状态

生活类比

备忘录就像是游戏存档

游戏存档

你可以随时保存游戏状态(备忘录),之后可以加载存档回到之前的状态。

代码实现

Example.java

实际应用

Git Version Control

Git 的版本控制就是备忘录模式的典型应用,可以保存和恢复代码状态。

Example.java

文本编辑器的撤销功能

大多数文本编辑器(如 VS Code、Sublime Text)使用备忘录模式实现撤销/重做功能。

Example.java

数据库事务回滚

数据库系统使用备忘录模式保存事务开始前的状态,以便在回滚时恢复。

Example.java

练习

1

备忘录模式的主要目的是什么?

2

备忘录模式中,管理者(Caretaker)可以直接访问备忘录的内部状态吗?

3

以下哪个不是备忘录模式的典型应用场景?