备忘录模式(Memento Pattern)

一、概念

备忘录模式(Memento Pattern)又称之为快照模式(Snapshop Pattern)或者令牌模式(Token Pattern),是指在不破坏封装的前提下,捕获一个对象的内部状态,并在对象之外保存这个状态,这样我们就可以在需要的时候将该对象恢复到原先保存的状态了

  • 大白话: 备忘录模式可以为我们提供一种“后悔药”的机制,它通过存储程序中某个对象的历史状态,使我们可以在任一时刻将程序回滚到历史状态。
  • 核心:使用第三方角色保存某个对象内部状态的拷贝,便于将该对象恢复到原先的状态

二、适用场景

  1. 需要保存/恢复数据的相关状态场景。
  2. 提供一个可回滚的操作。
  3. 希望在对象之外保存状态,且除了自己其他对象无法访问状态的具体保存内容

三、参与者

  • 发起人角色/被备份的角色(Originator):负责创建一个备忘录,记录自身需要保存的状态,而且需要具备状态的回滚功能。
  • 备忘录角色(Memento):用于存储Originator角色的内部状态,且可以防止Originator以外的对象进行访问Memento。
  • 负责人角色/备忘录管理员角色(Caretaker):负责存储,管理备忘录功能。且其本身应该无法对备忘录的内容进行访问
  • Client 用户

四、代码例子

一个Shell软件可以通过它执行一些命令,当执行完命令后我们可能想找回之前执行过的指令文本,相当于我们在操作linux命令窗口时按↑ \uparrow↑和↓ \downarrow↓按钮时会可以控制显示之前输入的命令行,恢复好命令后再次按回车即可执行

  • 发起人角色/被备份的角色(Originator):LinuxShell
  • 备忘录角色(Memento):Memo
  • 负责人角色/备忘录管理员角色(Caretaker):MemoContainer

五、UML图

(一)“白箱”备忘录模式

(二)“黑箱”备忘录模式

六、优缺点

(一)优点

  1. 它提供了一种状态恢复的实现机制,使得用户可以方便地回到一个特定的历史状态,当新的状态无效或者存在问题时,可以使用暂时存储起来的备忘录将状态复原。
  2. 简化了发起人角色的的职责,将状态的存储和获取进行了隔离,而且客户端无需关心状态的保存细节
  3. 备忘录角色是一种发起人角色状态的表示,不会被其他代码所改动。备忘录角色保存了发起人角色的状态,采用列表、堆栈等集合来存储备忘录对象可以实现多次撤销操作

(二)缺点

  • 消耗过大,如果需要保存的发起人角色类的成员变量太多,就不可避免需要占用大量的存储空间,每保存一次对象的状态都需要消耗一定的系统资源。
    • 为了节约内存,可使用 原型模式+备忘录模式。
posted @ 2022-12-13 16:35  ImreW  阅读(66)  评论(0编辑  收藏  举报