定义
- 在不破坏封装性的前提下,捕获一个对象的内部状态,并在对象之外保存这个状态
- 这样以后就可以将该对象恢复到以前的状态
使用场景
- 后悔药
- 游戏存档
- 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();
}优点与缺点
- 给用户提供了一种可以恢复的机制,方便用户回到某个历史状态,实现了存档封装的机制,用户不用关心保存细节
- 消耗资源,如果类的成员变量过多,会占用较大的资源,且每次保存都会消耗一定的内存
建议
为解决内存,可考虑使用 原型模式 + 备忘录模式