初尝Memento 模式
在软件构建过程中,某些对象的状态在转换过程中,可能由于某种需要,要求程序能够回溯到对象之前处于某个点时的状态。如果使用一些公有接口来让其他对象得到对象的状态,便会暴露对象的细节实现。
如何实现对象状态的良好保存与恢复?但同时又不会因此而破坏对象本身的封装性。
意图
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。
结构图
其实结构图中Caretaker 不一定必须实现,不难发现的是,他是对“备忘录”中保存的状态的起到一种暂存的作用。下面是一段代码:
using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
namespace Memento
{
class Program
{
static void Main(string[] args)
{
Person A = new Person("A");
Person B = new Person("B");
Person C = new Person("C");
HRSystem hr = new HRSystem();
hr.Add(A);
hr.Add(B);
Memento m = hr.CreatMemento();
hr.Add(C);
Console.WriteLine("After added C, we have :");
hr.ShowInfo();
Console.WriteLine("But, I've made a mistake...So:");
hr.RecoverToMemento(m);
hr.ShowInfo();
}
}
[Serializable]
class Person {
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
public Person(string name) {
this.name = name;
}
}
[Serializable]
class HRSystem {
List list = new List();
public void ShowInfo() {
Console.WriteLine("-----------------");
foreach (Person p in list) {
Console.WriteLine("{0} is available .",p.Name);
}
Console.WriteLine("-----------------");
}
public void Add(Person p) {
if (list != null && !list.Contains(p)) {
list.Add(p);
Console.WriteLine("{0} has been added!", p.Name);
}
}
public void Remove(Person p) {
if (list != null && list.Contains(p)) {
Console.WriteLine("{0} has been removed!",p.Name);
}
}
public void SetHRList(HRSystem hr) {
this.list = hr.list;
}
public Memento CreatMemento() {
Console.WriteLine("Now ,Saving State above ↑...");
return new Memento().SetMemento(this);
}
public void RecoverToMemento(Memento m) {
Console.WriteLine("Recovering To Memento...");
HRSystem hr = (HRSystem)m.GetMemento();
this.SetHRList(hr);
}
}
class Memento {
MemoryStream ms = new MemoryStream();
BinaryFormatter bf = new BinaryFormatter();
public Memento SetMemento(object obj) {
bf.Serialize(ms,obj);
return this;
}
public object GetMemento() {
ms.Seek(0,SeekOrigin.Begin);
return bf.Deserialize(ms);
}
}
}
运行截图


近期评论