飞客 - 备忘录模式
type: channel
link: https://achmydream.com/tag/%E5%A4%87%E5%BF%98%E5%BD%95%E6%A8%A1%E5%BC%8F/
items: 18. 备忘录模式

18. 备忘录模式
type: item
date: 2025-11-15T08:52:22+08:00
description: 定义在不破坏封装性的前提下，捕获一个对象的内部状态，并在对象之外保存这个状态这样以后就可以将该对象恢复到以前的状态使用场景后悔药游戏存档ctrl + z 撤销回滚操作，比如数据库事务代码实现//发起者<可读取写入存档> class Originator { private string state; public string State { get {return state;} set { state = value; } } //设置，可设置多个参数 public Memento CreateMemento() { return new Memento(state); } //恢复 public void SetMemento(Memento memento) { this.state = memento.State; } //展示 public void Show() { Console.WriteLine("state = {0}", state); } } //备忘录 class Memento { private string state; public string State { get {return state;} } public Memento(string state) { this.state = state; } } //管理者<只能读取存档，不能写入> class Caretaker { private Memento memento; public Memento Memento { get {return memento;} set {memento = value;} } } void Main() { Originator ori = new Originator(); ori.State = "On"; ori.Show(); Caretaker c = new Caretaker(); c.Memento = ori.CreateMemento(); //保存状态 ori.State = "Off"; ori.SetMemento(c.Memento); //恢复状态 ori.Show(); }优点与缺点给用户提供了一种可以恢复的机制，方便用户回到某个历史状态，实现了存档封装的机制，用户不用关心保存细节消耗资源，如果类的成员变量过多，会占用较大的资源，且每次保存都会消耗一定的内存建议为解决内存，可考虑使用 原型模式 + 备忘录模式