概述:
備忘錄模式(Memento):在不破壞封裝性的前提下,捕獲一個對象的內部狀態,並在該對象之外儲存這個狀態,這樣以後就可將該對象恢複到原先儲存的狀態。
應用場合:
1.必須儲存一個對象在某一時刻(部分)的狀態,這樣以後需要時它才能恢複到先前的狀態。
2.如果用一個介面來讓其他對象直接得到這個狀態,將會暴露對象的實現細節並破壞對象的封裝性。
類圖:
代碼結構執行個體:
1.建立一個備忘錄類
/// <summary>
/// 備忘錄類
/// </summary>
class Memento
{
private string _state;
public Memento(string state)
{
this._state = state;
}
public string State
{
get { return _state; }
}
}
2.發起人類
/// <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.管理者類
/// <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();
}
小結:
備忘錄模式好像大部分在遊戲程式設計裡使用,來儲存遊戲狀態,怎麼把用到web程式裡呢?糾結一下