原文 第18章 备忘录模式(Memento Pattern)
备忘录模式
概述:
备忘录模式(Memento Pattern)又叫做快照模式(Snapshot Pattern)或Token模式,是GoF的23种设计模式之一,属于行为模式。
定义(源于GoF《设计模式》):在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
结构图:
代码举例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | /// <summary> /// 发起人:记录当前时刻的内部状态,负责定义哪些属于备份范围的状态,负责创建和恢复备忘录数据。 /// </summary> class Originator { private string state; //获取状态 public string GetState() { return state; } public string State { set { state = value; } get { return state; } } //创建备忘录 public Memento Create() { return new Memento(state); } //恢复备忘录 public void Recover(Memento memento) { this .state = memento.State; } } /// <summary> /// 备忘录:负责存储发起人对象的内部状态,在需要的时候提供发起人需要的内部状态。 /// </summary> class Memento { private string state = "" ; public Memento( string state) { this .state = state; } public string State { set { state = value; } get { return state; } } } /// <summary> /// 管理角色:对备忘录进行管理,保存和提供备忘录。 /// </summary> class Caretaker { private Memento memento; public Memento Memento { get { return memento;} set { memento=value;} } } |
客户端调用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | class Program { static void Main( string [] args) { Originator originator = new Originator(); originator.State = "状态一" ; Caretaker caretaker = new Caretaker(); //备份状态 caretaker.Memento = originator.Create(); originator.State = "状态二" ; //恢复状态 originator.Recover(caretaker.Memento); //结果输出状态一 Console.WriteLine(originator.State); Console.ReadLine(); } } |
一个很简单的备忘录模式就写好了,其实就是把对象存到一个地方,需要的时候就去取回来。当然我们平常用到的肯定不是上面的只能存储一个备忘录的,应该是存储很多个状态的。比如我们可以在上面的存储对象的地方用一个集合来存储要备忘的对象,这样就可以很容易的实现多个状态存储。
适用场景:
1.如果一个对象需要保存状态并可通过undo或rollback等操作恢复到以前的状态时,可以使用Memento模式
2.一个类需要保存它的对象的状态(相当于Originator角色)
3.设计一个类,该类只是用来保存上述对象的状态(相当于Memento角色)
4.需要的时候,Caretaker角色要求Originator返回一个Memento并加以保存
5.undo或rollback操作时,通过Caretaker保存的Memento恢复Originator对象的状态