跳转至

备忘录模式

分类:行为型模式。

类结构

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 "仅发起人可以访问内部游戏状态"

协作过程

  1. 玩家选择保存时,客户端调用游戏对象的 getCurrentState()。
  2. 游戏对象把需要恢复的状态封装进备忘录,并交给客户端保管。
  3. 玩家选择读档时,客户端将之前的备忘录交给 restoreState()。
  4. 游戏对象恢复自己的状态;客户端始终把备忘录当成不透明存档。

场景来源(Google Books 原书公开检索片段;示例类图为本笔记整理):

评论