定义
在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样就可以在以后将对象恢复到原先保存的状态。
备忘录模式提供了一种状态恢复的实现机制,使得用户可以方便地回到一个特定的历史步骤,当新的状态无效或者存在问题时,可以使用暂时存储起来的备忘录将状态复原,当前在很多软件所提供的撤销(Undo)操作中就使用了备忘录模式。
举例
电脑上常见的撤销(ctrl+z)功能,备忘录模式的功能
结构
实现
class Originstor
{
//需要保存的属性
private string state;
public string State
{
get { return state; }
set { state = value; }
}
//创建备忘录,将当前需要保存的信息导入并实例化出一个Memento对象
public Memento CreateMemento()
{
return (new Memento(state));
}
//恢复备忘录,将Memento导入并将相关数据恢复
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; }
}
}
class Program
{
static void Main(string[] args)
{
Originstor o = new Originstor();
o.State = "On"; //设置初始状态属性为"On"
o.Show();
Caretaker c = new Caretaker();
//保存状态时,由于有了很好的封装,可以隐藏Originator的实现细节
c.Memento = o.CreateMemento();
o.State = "Off";
o.Show(); //改变状态属性
o.SetMemento(c.Memento);
o.Show(); //恢复初始状态
}
}
优点
- (1)备忘录模式提供了一种状态恢复的实现机制,使得用户可以方便地回到一个特定的历史步骤,当新的状态无效或者存在问题时,可以使用暂时存储起来的备忘录将状态复原。
- (2)备忘录模式实现了对信息的封装,一个备忘录对象是一种原发器对象状态的表示,不会被其他代码所改动。备忘录保存了原发器的状态,采用列表、堆栈等集合来存储备忘录对象,可以实现多次撤销操作。
缺点
备忘录模式资源消耗过大,如果需要保存的原发器类的成员变量太多,就不可避免地需要占用大量的存储空间,每保存一次对象的状态都需要消耗一定的系统资源。
适用环境
- (1)保存一个对象在某一个时刻的全部状态或部分状态,这样以后需要时能够恢复到先前的状态,实现撤销操作。
- (2)防止外界对象破坏一个对象历史状态的封装性,避免将对象历史状态的实现细节暴露给外界对象。