定义

  1. 在不破坏封装性的前提下,捕获一个对象的内部状态,并在对象之外保存这个状态
  2. 这样以后就可以将该对象恢复到以前的状态

使用场景

  1. 后悔药
  2. 游戏存档
  3. ctrl + z 撤销
  4. 回滚操作,比如数据库事务

代码实现

//发起者<可读取写入存档>
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();

}

优点与缺点

  1. 给用户提供了一种可以恢复的机制,方便用户回到某个历史状态,实现了存档封装的机制,用户不用关心保存细节
  2. 消耗资源,如果类的成员变量过多,会占用较大的资源,且每次保存都会消耗一定的内存

建议

为解决内存,可考虑使用 原型模式 + 备忘录模式