在不破壞封裝性的前提下,捕獲乙個物件的內部狀態,並在該物件之外儲存這個狀態,以便以後當需要時能將該物件恢復到原先儲存的狀態。該模式又叫快照模式。
乙個物件中一般都封裝了很多屬性,這些屬性的值會隨著程式的執行而變化。當我們需要儲存某一時刻物件的某些值的時候,我們就再建立乙個物件,將當前物件中的一些屬性儲存到新的物件中,當我們需要恢復的時候再從新的物件中取出屬性值即可。這種想法就是備忘錄模式。
優點:
提供了一種可以恢復狀態的機制。當使用者需要時能夠比較方便地將資料恢復到某個歷史的狀態。
實現了內部狀態的封裝。除了建立它的發起人之外,其他物件都不能夠訪問這些狀態資訊。
簡化了發起人類。發起人不需要管理和儲存其內部狀態的各個備份,所有狀態資訊都儲存在備忘錄中,並由管理者進行管理,這符合單一職責原則。
缺點:
資源消耗大。如果要儲存的內部狀態資訊過多或者特別頻繁,將會占用比較大的記憶體資源。
應用場景:
當乙個物件需要記錄其歷史屬性,並且需要記錄的屬性是所有屬性的一部分時,可以使用備忘錄模式記錄屬性。
需要備份的類是orginator,備份的資料儲存在mementor中,由caretaker來管理mementor。
orginator中必須含有兩個函式,乙個是createmementor(),用來建立mementor物件,並將需要備份的資料儲存到該物件中;另外乙個是setmementor(mementor),用來恢復資料,將傳入的mementor物件中的資料取出來,賦給當前物件中的屬性。
有的人說,備忘錄模式就是用來儲存物件中一些屬性,那麼當我們需要備份物件中屬性的時候完全可以轉殖這個物件嘛,何必採用構造這麼複雜的備忘錄模式呢?
原因有以下幾點:
ps:在只備份一部分屬性的時候也可以新建乙個物件,然後把需要備份的屬性一一複製給新物件中;然後當還原的時候再一一複製到原本的物件中去。但這樣做太爛了!因為客戶端在備份的時候必須要記住哪些屬性備份了,好在還原的時候還原這些屬性。而且當需要備份的屬性發生變化的時候,必須修改客戶端**,這很不科學。
參考:(1)「備忘錄模式」就這麼簡單
(2)備忘錄模式(詳解版)
行為型模式 備忘錄模式
備忘錄模式 在不破壞原封裝性的前提下,捕獲乙個物件的內部狀態,並在該物件之外儲存這個狀態。這樣,以後就可以將該物件恢復到原先儲存的狀態。備忘錄模式角色 發起人 originator 角色 該角色記錄當前時刻的內部狀態,負責定義哪些屬於備份範圍的狀態,負責建立和恢復備忘錄資料 備忘錄 memento ...
行為型模式 備忘錄模式
核心 就是儲存某個物件內部狀態的拷貝,這樣以後就可以將該物件恢復到原先的狀態。結構1 源髮器類 originator。2 備忘錄類 memento。3 負責人類 care take。開發中常見的應用場景 1 棋類遊戲中的,悔棋。2 普通軟體中的,撤銷操作。3 資料庫軟體中的,事務管理中的,回滾操作。...
備忘錄模式 物件行為型模式
一 意圖 在不破壞封裝性的前提下,捕獲乙個物件的內部狀態,並在該物件之外儲存這個狀態。這樣以後就可以將該物件恢復到原先儲存的狀態。二 適用性 以下情況使用備忘錄模式 三 結構 四 public class callofduty public void quit public memento crea...