备忘录模式(Memento)定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。该模式又叫快照模式。
使用场景:
- 使用命令模式时,需要实现命令的撤销
- 还原错误或无效的状态
结构:
- 发起人(Originator)角色:记录当前时刻的内部状态信息,提供创建备忘录和恢复备忘录数据的功能,实现其他业务功能,它可以访问备忘录里的所有信息。
- 备忘录(Memento)角色:负责存储发起人的内部状态,在需要的时候提供这些内部状态给发起人。
- 管理者(Caretaker)角色:对备忘录进行管理,提供保存与获取备忘录的功能,但其不能对备忘录的内容进行访问与修改。
发起人类:
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)//恢复备忘录,将备忘录导入并将相关数据恢复
{
state = memento.State;
}
public void Show()//显示数据
{ Console.WriteLine("State="+state); }
}
备忘录类:
class Memento //备忘录类
{
private string state;
public Memento(string state)//构造方法
{
this.state = state;
}
public string State//只读,需要保存的状态
{
get { return state; }
}
}
管理者类:
class Caretaker //管理者类
{
private Memento memento;
public Memento Memento //得到或设置备忘录
{
get { return memento; }
set { memento = value;}
}
}
客户端:
static void Main(string[] args)
{
Originator o = new Originator();
o.State = "On";
o.Show();
//保存状态时,由于进行了封装,可以隐藏Originator的实现细节
Caretaker c = new Caretaker();
c.Memento = o.CreateMemento();//创建状态为On的备忘录实例,并赋给Memento属性
o.State = "Off";
o.Show();
o.SetMemento(c.Memento);
o.Show();
Console.Read();
}