什么是备忘录模式?
备忘录模式是一种行为型设计模式,它的主要目标是:在不破坏封装的前提下,捕获一个对象的内部状态,并在以后需要时恢复到该状态。
换句话说,备忘录模式允许你保存对象的快照,并在需要时恢复它。
通俗解释
想象一个文本编辑器有“保存”和“撤销”功能:
- 当用户点击“保存”时,编辑器会保存当前的文本内容和光标位置。
- 如果用户点击“撤销”,编辑器会恢复到上一次保存的状态。
在备忘录模式中:
- 编辑器是“发起人”对象,负责保存和恢复状态。
- 备忘录存储状态的快照。
- 管理者负责存储和管理备忘录(如保存历史记录)。
备忘录模式的特点
核心思想
将对象的状态保存到一个独立的备忘录对象中,从而可以在未来恢复状态。
优点
- 状态恢复:允许对象回滚到以前的状态。
- 封装性:备忘录对象独立于发起人,外界无法直接访问发起人的内部状态。
- 简化复杂操作:撤销/重做功能的实现变得非常直观。
缺点
- 内存开销:每次保存状态都会创建备忘录,可能占用大量内存。
- 实现复杂性:如果需要频繁保存复杂对象的状态,备忘录的管理会变得困难。
备忘录模式的结构
UML 类图
+---------------------+
| Originator | // 发起人
+---------------------+
| - state: string | // 状态
| + saveState() | // 保存状态
| + restoreState(m) | // 恢复状态
+---------------------+
^
|
+---------------------+
| Memento | // 备忘录
+---------------------+
| + getState() |
+---------------------+
^
|
+---------------------+
| Caretaker | // 管理者
+---------------------+
| - mementos: list | // 管理备忘录
| + addMemento(m) |
| + getMemento(index) |
+---------------------+
角色说明
-
Originator(发起人):
- 负责创建备忘录和恢复状态。
- 保存的状态可以是任何需要回滚的对象属性。
-
Memento(备忘录):
- 存储发起人对象的状态快照。
- 提供一个接口,让发起人可以恢复到以前的状态。
-
Caretaker(管理者):
- 负责存储和管理备忘录。
- 不直接操作备忘录的内容,只负责存储和检索备忘录。
备忘录模式的优缺点
优点
- 解耦:发起人和管理者相互独立,符合单一职责原则。
- 恢复状态:可以方便地实现撤销/重做功能。
- 封装性:备忘录封装了状态,外部无法访问。
缺点
- 内存开销大:每次保存状态都会占用内存。
- 实现复杂:需要维护备忘录列表,并确保备忘录的完整性。
案例:文本编辑器的“保存”和“撤销”功能
需求描述
设计一个简单的文本编辑器,支持以下功能:
- 保存当前的文本内容(快照)。
- 撤销到之前保存的状态。
完整代码实现
以下是备忘录模式在文本编辑器场景中的应用。
#include <iostream>
#include <string>
#include <vector>
#include <memory>
// 备忘录类:存储文本状态
class Memento {
private:
std::string state; // 保存的文本内容
public:
explicit Memento(const std::string& state) : state(state) {
}
std::string getState() const {
return state; // 返回保存的文本状态
}
};