備忘錄模式(memento pattern):在不破壞封裝的前提下,捕獲乙個物件的內部狀態,並在該物件之外儲存這個狀態,這樣可以在以後將物件恢復到原先儲存的狀態.
originator(原發器):它是乙個普通類,可以建立乙個備忘錄,並儲存它的當前內部狀態,也可以使用備忘錄來恢復其內部狀態,一般將需要儲存內部狀態的類設計為原發器.
memento(備忘錄):儲存原發器的內部狀態,根據原發器來決定儲存那些內部狀態.備忘錄的設計一般可以參考原發器的設計,根據實際需要確定備忘錄類中的屬性.需要注意的是,除了原發器本身與負責人類之外,備忘錄物件不能直接供其他類使用,原發器的設計在不同的語言中實現機制會有所不同.
caretaker(負責人):負責人又稱為管理者,它負責儲存備忘錄,但是不能對備忘錄的內容進行操作或檢查.在負責人類中可以儲存乙個或多個備忘錄物件,它只負責儲存物件,而不能修改物件,也無需知道物件的實現細節.
public class originator
//建立乙個備忘錄物件
public memento creatememento()
//根據備忘錄物件恢復原發器狀態
public void restorememento(memento memento)
public string getstate()
public void setstate(string state)
}
public class memento
public string getstate()
public void setstate(string state)
}
public class caretaker
public void setmemento(memento memento)
}
public class client
}
上述**中只能儲存乙個狀態,如果想儲存多個狀態,並且可以撤銷重做,則可以做如下修改:
public class caretakerlist
public void setmemento(memento memento)
}
public class clientlist
public static void changestate(originator originator,string state)
public static void undo(originator originator)
public static void redo(originator originator)
}
主要優點:
1)它提供了一種狀態恢復的實現機制,使得使用者可以方便的回到乙個特定的歷史步驟,當新的抓鬼太無效或者存在問題時,可以適用暫時儲存起來的備忘錄將狀態復原
2)備忘錄實現了對資訊的封裝,乙個備忘錄物件是一種對原發器物件狀態的表示,不會被其他**改動.備忘錄儲存了原發器的狀態,採用列表,堆疊等集合來儲存備忘錄物件可以實現多次撤銷重做操作.
主要缺點:
資源消耗過大,如果需要儲存的原發器類的成員變數太多,就不可避免需要占用大量的儲存空間,每儲存一次物件的狀態都需要消耗一定的系統資源.
適用場景:
1)儲存乙個物件在某乙個時刻的全部狀態或部分狀態,這樣以後需要時它能夠恢復到先前的狀態,實現撤銷操作。
2)防止外界物件破壞乙個物件歷史狀態的封裝性,避免將物件歷史狀態的實現細節暴露給外界物件。
備忘錄模式
備忘錄模式 memento 在不破壞封裝性的前提下,捕獲乙個物件的內部狀態,並在該物件之外儲存這個狀態。這樣以後就可將該物件恢復到原先儲存的狀態。originator 發起人 負責建立乙個備忘錄memento,用以記錄當前時刻它的內部狀態,並可以使用備忘錄恢復內部狀態。originator可根據需要...
備忘錄模式
先從物件導向的三大特徵之一封裝說起。物件導向的封裝簡單點說就是把狀態 資料 和行為 操作這些資料的方法 放到一起,構成乙個單元,通常叫做類。乙個物件的行為是事先確定好的 靜態 一些指令碼,如果物件的狀態相同,物件看起來就是一樣的。所以當我們需要把乙個物件的某一時刻儲存起來,那麼只需要儲存它在那個時刻...
備忘錄模式
面臨問題 物件狀態的變化無端,如何回溯恢復物件在某個點的狀態?在軟體構建過程中,某些物件的狀態在轉換過程中,可能由於某種需要,要求程式能夠回溯到物件之前處於某個點時的狀態。如果使用一些公用介面來讓其他物件得到物件的狀態,便會暴露物件的細節實現。如何實現物件狀態的良好儲存與恢復?但同時又不會因此而破壞...