[整理] 设计模式之备忘录模式
概述
备忘录模式(Memento [mə'mentəʊ] ):
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可将该对象恢复到原先保存的状态。
应用场合
- 必须保存一个对象在某一时刻(部分)的状态,这样以后需要时它才能恢复到先前的状态。
- 如果用一个接口来让其他对象直接得到这个状态,将会暴露对象的实现细节并破坏对象的封装性。
类图
代码结构实例
1. 创建一个备忘录类
/// <summary>
/// 备忘录类
/// </summary>
class Memento
{
private string _state;
public Memento(string state)
{
this._state = state;
}
public string State
{
get { return _state; }
}
}
2. 发起人类
Originator [ə'rɪdʒə.neɪtə]
/// <summary>
/// 发起人类
/// </summary>
class Originator
{
/// <summary>
/// 需要保存的属性
/// </summary>
private string state;
public string State
{
get { return state; }
set { state = value; }
}
/// <summary>
/// 创建备忘录,将当前需要保存的信息导入并实例化一个Memento对象
/// </summary>
/// <returns></returns>
public Memento CreateMemento()
{
return (new Memento((state)));
}
/// <summary>
/// 恢复备忘录模式,将Memento导入并将相关数据恢复
/// </summary>
/// <param name="memento"></param>
public void SetMemento(Memento memento)
{
state = memento.State;
}
/// <summary>
/// 显示状态
/// </summary>
public void Show()
{
Console.WriteLine("State="+state);
}
}
3. 管理者类
Caretaker ['keə.teɪkə]
/// <summary>
/// 管理者类
/// </summary>
class Caretaker
{
/// <summary>
/// 得到备忘录
/// </summary>
private Memento memento;
public Memento Memento
{
get { return memento; }
set { memento = value; }
}
}
4. 客户端调用
/// <summary>
/// 测试备忘录模式
/// </summary>
static void TestMemento()
{
Originator o = new Originator();
o.State = "On"; //初始状态
o.Show();
Caretaker c = new Caretaker();
c.Memento = o.CreateMemento();//保存状态
o.State = "Off";//状态改变为Off
o.Show();
o.SetMemento(c.Memento);//恢复原始状态
o.Show();
Console.Read();
}
小结
备忘录模式好像大部分在游戏程序设计里使用,来保存游戏状态
附记:在茫茫的信息海洋中,遇到就是有缘,期待回复交流,为缘分留下痕迹……