1. 程式人生 > >常用軟體設計模式(四)備忘錄模式

常用軟體設計模式(四)備忘錄模式

備忘錄模式:在不破壞封裝性的前提下,捕獲一個物件的內部狀態,並在該物件之外儲存這個狀態。這樣以後就可將該物件恢復到原先儲存的狀態

優點:1、給使用者提供了一種可以恢復狀態的機制,可以使使用者能夠比較方便地回到某個歷史的狀態。

           2、實現了資訊的封裝,使得使用者不需要關心狀態的儲存細節。

缺點:消耗資源。如果類的成員變數過多,勢必會佔用比較大的資源,而且每一次儲存都會消耗一定的記憶體。

使用場景: 1、需要儲存恢復資料的相關狀態場景。 2、提供一個可回滾的操作。

為了符合迪米特原則,還要增加一個管理備忘錄的類。為了節約記憶體,可使用原型模式+備忘錄模。

三角色:發起人類(Originator)、備忘錄類(Memento)、管理類(Caretaker)

//Originator(發起人):負責建立一個備忘錄Memento,用以記錄當前時刻它的內部狀態,並可使用備忘錄恢復內部狀態。
//Originator可根據需要決定Memento儲存Originator的哪些內部狀態
class Originator
{
	//需要儲存的屬性,可能有多個
	private string state;
	public string State
	{
		get{return state;}
		set{state = value;}
	}

	//建立備忘錄,將當前需要儲存的資訊匯入並例項化出一個Memento物件
	public Memento CreateMemento()
	{
		return (new Memento(state));
	}

	//回覆備忘錄,將Memento匯入並將相關資料恢復
	public void SetMemento(Memento memento)
	{
		state = memento.State;
	}
	public void Show()
	{
		Console.WriteLine("State="+state);
	}
};



//Memento(備忘錄):負責儲存Originator物件的內部狀態,並可防止Originator以外的其他物件訪問備忘錄Memento。
//備忘錄有兩個介面,Caretaker只能看到備忘錄的窄介面,他只能將備忘錄傳遞給其他物件。Originator能夠看到一個寬介面,
//允許他訪問返回到先前狀態所需的所有資料
class Memento
{
	private string state;
	public Memento(string state)
	{
		this->state = state;
	}

	public string State
	{
		get{return state;}
	}
}


//Caretaker(管理者):負責儲存好備忘錄Memento,不能對備忘錄的內容進行操作或檢查
class CareTaker
{
	private Memento memento;
	public Memento Memento
	{
		get{return memento;}
		set{memento = value;}
	};
}

客戶端:

static void Main(string[] args)
{
	//初始狀態為On
	Originator o = new Originator();
	o.State = "On";
	o.Show();

	//儲存狀態時,由於有了很好的封裝,可以隱藏Originator的實現細節 
	Caretater c = new Caretater();
	c.Memento = o.CreateMemento();

	o.State = "Off";
	o.Show();

	//回覆原始狀態
	o.SetMemento(c.Memento);
	o.Show();

	Console.Read();
}