备忘录模式¶
分类:行为型模式。
类结构¶
classDiagram
direction TB
class Originator {
-String state
+save() Memento
+restore(Memento memento)
}
class Memento {
<<interface>>
}
class Snapshot {
-String state
}
class Caretaker {
+backup()
+undo()
}
Memento <|.. Snapshot
Originator ..> Snapshot : 创建与读取内部状态
Caretaker --> Originator : 发起保存或恢复
Caretaker o-- "0..*" Memento : 保存快照
note for Snapshot "内部状态仅供 Originator 访问"
角色定义¶
| 角色 | 定义 |
|---|---|
| Originator(发起人) | 拥有需要保存的状态,创建快照并根据快照恢复自身状态。 |
| Memento(备忘录窄接口) | 提供给管理者的不透明快照引用,不暴露读取或修改业务状态的方法。 |
| Snapshot(具体备忘录) | 保存某一时刻的状态,由发起人创建和读取;内部状态对管理者隐藏。 |
| Caretaker(管理者) | 保存备忘录并决定何时请求保存或恢复,不查看或修改备忘录的内部状态。 |
Head First 示例:游戏存档与恢复¶
原书附录用角色扮演游戏的“保存进度”说明备忘录:玩家失败后希望恢复到先前状态,而外部代码不应因此直接读取或改写游戏对象复杂的内部数据。
以下**教学建模**保留原书示意中的 MasterGameObject、GameMemento、Client 以及保存、恢复两个主要操作。状态字段、返回类型和客户端保存多个快照的安排经过简化,不是作者配套仓库中的完整实现。
| 示例类型 | 模式角色 | 职责 |
|---|---|---|
| MasterGameObject | 发起人 | 掌握游戏内部状态,生成当前快照,并用快照恢复自身。 |
| GameMemento | 备忘录 | 保存某一时刻的游戏状态,内容只向发起人开放。 |
| Client | 管理者 | 决定何时保存或恢复,并持有存档引用,不操作存档内部状态。 |
示例 UML¶
classDiagram
direction TB
class MasterGameObject {
-GameState state
+getCurrentState() GameMemento
+restoreState(GameMemento savedState)
}
class GameMemento {
-GameState state
}
class Client {
+saveGame()
+restoreGame()
}
Client --> MasterGameObject : 请求保存或恢复
Client o-- "0..*" GameMemento : 保管存档
MasterGameObject ..> GameMemento : 创建并读取快照
note for GameMemento "仅发起人可以访问内部游戏状态"
协作过程¶
- 玩家选择保存时,客户端调用游戏对象的
getCurrentState()。 - 游戏对象把需要恢复的状态封装进备忘录,并交给客户端保管。
- 玩家选择读档时,客户端将之前的备忘录交给
restoreState()。 - 游戏对象恢复自己的状态;客户端始终把备忘录当成不透明存档。
场景来源(Google Books 原书公开检索片段;示例类图为本笔记整理):