设计模式之备忘录模式
名词解释:
备忘录:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
使用场景:
你在玩游戏,突然有事,此时如果关闭电脑,进度肯定木有了,然后你就点击保存,关闭电脑出去了;完事之后,你又点击加载进度,又开始玩了,这个就是一个标准的备忘录模式场景。
必需元素:
发起人:负责创建一个备忘录,用以记录当前时刻它的内部状态,并可使用备忘录恢复内部状态 。发起人可根据需要决定备忘录存储发起人的哪些内部状态。
备忘录:负责存储发起人对象的内部状态,并可防止发起人以外的其他对象访问备忘录。备忘录有两个接口,管理者只能看到备忘录的窄接口,它只能将备忘录传递给其他对象。发起人能够看到一个宽接口,允许它访问到先前状态所需的所有数据。
管理者:负责保存好备忘录,不能对备忘录的内容进行操作或检查(其实就是来管理备忘录数据的)。
其实说白了,备忘录是一个实体类,存放所有要备忘的状态(属性);而发起人呢也有自己的状态(也可以成为属性),当然也必须有用于保存备忘录和恢复备忘录的方法;管理者中呢就是有一个备忘录的对象,当然是用于保存发起人保存的备忘录也供发起人恢复使用。
上例子:
发起者:
/// <summary> /// 发起者 /// </summary> class Originator { private string state; /// <summary> /// 要保存的属性(你可以随便添加哦) /// </summary> public string State { get { return state; } set { state = value; } } /// <summary> /// 创建备忘录 /// </summary> /// <returns></returns> public Memento CreateMemento() { return new Memento(state); } /// <summary> /// 恢复备忘录 /// </summary> /// <param name="memento"></param> public void SetMemento(Memento memento) { state = memento.State; } public void Show() { Console.WriteLine("State="+state); } }
备忘录类:
/// <summary> /// 备忘录 /// </summary> class Memento { private string state; /// <summary> /// 保存的属性(通常和发起者类中的属性一一对应) /// </summary> public string State { get { return state; } } public Memento(string state) { this.state = state; } }
管理者:
/// <summary> /// 管理者类(主要是隔离了发起者和备忘录,主要就是存放了备忘录对象) /// </summary> class Caretaker { private Memento memento; /// <summary> /// 备忘录对象 /// </summary> public Memento Memento { get { return memento; } set { memento = value; } } }
使用:
//定义发起者对象 Originator o = new Originator(); //设置需要保存的属性 o.State = "ON"; o.Show(); //定义管理者对象 Caretaker c = new Caretaker(); //创建备忘录 c.Memento = o.CreateMemento(); //吸怪属性 o.State = "OFF"; o.Show(); //恢复备忘录 o.SetMemento(c.Memento); o.Show(); Console.Read();
其实,这个备忘录模式应该是蛮简单的,就是一个类存储一些要保存的信息,可以进行保存和恢复,最主要是我们通过一个管理者类将发起者和备忘录类进行了隔离。