常用軟體設計模式(四)備忘錄模式
阿新 • • 發佈:2018-11-08
備忘錄模式:在不破壞封裝性的前提下,捕獲一個物件的內部狀態,並在該物件之外儲存這個狀態。這樣以後就可將該物件恢復到原先儲存的狀態
優點: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(); }