Memento模式的關鍵就是要在不破壞封裝性的前提下,捕獲一個對象的內部狀態並在該對象之外保存這個狀態。這樣以後就可以利用該保存的狀態實施恢復操作。
模式結構
- Originator(原發器)
創建一個備忘錄,並存儲它的當前內部狀態,也可以使用備忘錄來回復其內部狀態。 - Memento(備忘錄)
儲存原發器的內部狀態,備忘錄的設計一般可以參考原發器的設計,根據實際需要確定備忘錄類中的屬性。 - Caretaker(負責人)
負責人又稱爲管理者,在負責人類中可以儲存一個或多個備忘錄對象,他只負責存儲對象而不能修改獨享,也無需知道對象的實現細節。
基本代碼
class Originator
{
private string state;
public string State
{
get { return state; }
set { state = value; }
}
public Memento CreateMemento()
{
return (new Memento(state));
}
public void SetMemento(Memento menmento)
{
state = menmento.State;
}
public void Show()
{
Console.WriteLine("State=" + state);
}
}
//備忘錄類
class Memento
{
private string state;
public Memento(string state)
{
this.state = state;
}
public string State
{
get { return state; }
}
}
//管理者類
class Caretaker
{
private Memento memento;
public Memento Memento
{
get { return memento; }
set { memento = value; }
}
}
class Program
{
static void Main(string[] args)
{
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();
}
}class="one-pan-link-mark">優點
- 有時一些發起人對象的內部信息必須保存在發起人對象以外的地方,但是必須要由發起人對象自己讀取。這時,使用備忘錄模式可以把複雜的發起入內部信息對其他的對象屏蔽起來,從而可以恰當地保持封裝的邊界。
- 本模式簡化了發起人類。發起人不再需要管理和保存其內部狀態的一個個版本,客戶端可以自行管理他們所需要的這些狀態的版本。
- 當發起人角色的狀態改變的時候,有可能這個狀態無效,這時候就可以使用暫時存儲起來的備忘錄將狀態復原。
缺點
- 如果發起人角色的狀態需要完整地存儲到備忘錄對象中,那麼在資源消耗上面備忘錄對象會很大。
- 當管理者角色將-一個備忘錄存儲起來的時候,管理者可能並不知道這個狀態會佔用多大的存儲空間,從而無法提醒用戶一個操作是否很大。
適用場合
如果必須保存一個對象在某一個時刻的全部或者部分狀態,不方便在以後需要的時候,可以把該對象恢復到先前的狀態,可以使用備忘錄模式
本質
保存和恢復內部狀態。