1. 人人编程首页
  2. 架构设计

备忘录设计模式

意图

  • 在不违反封装的情况下,捕获并外化对象的内部状态,以便稍后可以将对象返回到该状态。
  • 封装“检查点”功能的魔术 cookie。
  • 将撤消或回滚提升到完整对象状态。

问题

需要将对象恢复到之前的状态(例如“撤消”或“回滚”操作)。

讨论

当客户端需要检查源对象的状态时,它会从源对象请求备忘录。源对象使用其状态特征来初始化 Memento。客户端是 Memento 的“看守人”,但只有源对象可以存储和检索 Memento 中的信息(Memento 对客户端和所有其他对象是“不透明的”)。如果客户端随后需要“回滚”源对象的状态,它会将备忘录交回源对象以进行恢复。

使用一堆 Command 对象和一堆 Memento 对象可以轻松实现无限的“撤消”和“重做”功能。

Memento 设计模式定义了三个不同的角色:

  1. 发起者– 知道如何自救的对象。
  2. 看守者– 知道发起者为何以及何时需要保存和恢复自身的对象。
  3. Memento – 由 Originator 读写并由 Caretaker 管理的锁箱。

结构

备忘录设计模式

例子

Memento 捕获并外部化对象的内部状态,以便稍后可以将对象恢复到该状态。这种模式在修理汽车鼓式制动器的DIY机械师中很常见。鼓从两侧拆下,露出左右制动器。只有一侧被拆卸,另一侧作为刹车部件如何装配在一起的纪念品。只有在一侧完成工作后,才能拆卸另一侧。当第二面被拆卸时,第一面充当纪念品。

备忘录设计模式

检查清单

  1. 确定“看守人”和“发起人”的角色。
  2. 创建一个 Memento 类并将创建者声明为朋友。
  3. 看守者知道何时“检查点”发起者。
  4. Originator 创建一个 Memento 并将其状态复制到该 Memento。
  5. 看守人抓住(但不能窥视)纪念品。
  6. 看守者知道何时“回滚”发起者。
  7. Originator 使用 Memento 中保存的状态恢复自身。

经验法则

  • Command 和 Memento 充当魔法标记,以便在以后传递和调用。在 Command 中,token 代表一个请求;在 Memento 中,它表示对象在特定时间的内部状态。多态性对 Command 很重要,但对 Memento 不重要,因为它的接口非常狭窄,以至于 memento 只能作为值传递。
  • 命令可以使用 Memento 来维护撤消操作所需的状态。
  • Memento 经常与 Iterator 结合使用。Iterator 可以使用 Memento 来捕获迭代的状态。迭代器在内部存储备忘录。

本文来自转载,原文链接:

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注