在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态了。
将要保存的细节封装在Memento中,哪天要更改保存的细节也不影响客户端。
Memento模式比较适用于功能比较复杂的,但需要维护或记录属性历史的类,或者需要保存的属性只是众多属性中的一小部分。Originator可以根据保存的Memento信息还原到前一个状态。如果在某个系统中使用命令模式时,需要实现命令的撤销功能,那么命令模式可以使用备忘录模式来存储可撤销操作的状态。有时一些对象的内部信息必须保存在对象意外的地方,但是必须要由对象自己来读取,这时,使用备忘录模式可以把复杂的对象内部信息对其他的对象屏蔽起来,从而可以恰当的保持封装的边界。
//发起人类 class Origninator { public string state { get; set; }//需要保存的属性,可能是多个。 public Memento CreateMemento()//创建备忘录,将当前需要保存的信息导入并实例化出一个Memento对象。 { return (new Memento(state)); } public void SetMemento(Memento memento) { state = memento.State;//恢复备忘录,将Memento导入将相关数据恢复。 } 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 { public Memento memento{ get; set; }//得到或设置备忘录 } static void Main(string[] args) { Origninator o = new Origninator();//Orignator初始状态,状态为"On"。 o.state = "On"; o.Show(); Caretaker c = new Caretaker();//保存状态时,由于有了很好的封装,可以隐藏Orignator的实现细节。 c.memento = o.CreateMemento(); o.state = "Off";//Orignator改变了状态属性为"Off"。 o.Show(); o.SetMemento(c.memento);//恢复初始状态。 o.Show(); }