一、定義
備忘錄模式(memento):在不破壞封裝性的前提下,捕獲乙個物件的內部狀態,並在該物件之外儲存這個狀態。這樣以後就可將該物件恢復到原先儲存的狀態。
二、備忘錄模式結構圖
備忘錄模式中涉及的角色:
發起人(originator)角色:負責建立乙個備忘錄memento,用以記錄當前時刻它的內部狀態,並可使用備忘錄恢復內部狀態。originator可根據需要決定memento儲存originator的哪些內部狀態。
備忘錄(memento)角色:負責儲存originator的內部狀態,並可防止originator以外的其他物件訪問備忘錄memento。備忘錄有兩個介面,caretaker只能看到備忘錄的窄介面,他只能將備忘錄傳遞給其他物件。originator能夠看到乙個寬介面,允許它訪問返回到先前狀態所需的所有資料。
管理者(caretaker)角色:負責儲存好備忘錄memento,不能對備忘錄的內容進行操作或檢查。
三、例子
備忘錄模式模擬版本控制系統的工作流程。
/**
* document類代表需要被納入版本控制系統的文件
* 發起人角色
* @author yikexin
* */
public class document
/*** 恢復為某個備份
* @param backup
*/public void resume(backup backup)
@override
public string tostring()
}
/**
* backup類代表版本控制系統中儲存的每乙個備份
* 備忘錄角色
* @author yikexin
* */
public class backup
public string getcontent()
public void setcontent(string content)
}
/**
* versioncontrolsystem 代表版本控制系統
* 負責人角色
* @author yikexin
* */
public class versioncontrolsystem
/*** 獲取某個版本的備份
* @param version
* @return
*/public backup get(int version)
} return null; }
/*** 取得最後乙個版本的備份
* @return
*/public backup getlastversion()
}
public class client
}
輸出結果:
document [content=content1, othercontent=othercontent1]
儲存備份
document [content=content2, othercontent=othercontent2]
儲存備份
document [content=content3, othercontent=othercontent3]
儲存備份
恢復備份
document [content=content1, othercontent=othercontent3]
恢復備份
document [content=content3, othercontent=othercontent3]
四、備忘錄模式優缺點優點:
提供了一種狀態恢復的實現機制,使得使用者可以方便地回到乙個特定的歷史步驟,當新的狀態無效或者存在問題時,可以使用先前儲存起來的備忘錄將狀態復原。
實現了資訊的封裝,乙個備忘錄物件是一種原發器物件的表示,不會被其他**改動,這種模式簡化了原發器物件,備忘錄只儲存原發器的狀態,採用堆疊來儲存備忘錄物件可以實現多次撤銷操作,可以通過在負責人中定義集合物件來儲存多個備忘錄。
缺點:資源消耗過大,如果類的成員變數太多,就不可避免占用大量的記憶體,而且每儲存一次物件的狀態都需要消耗記憶體資源,如果知道這一點大家就容易理解為什麼一些提供了撤銷功能的軟體在執行時所需的記憶體和硬碟空間比較大了。
適用場景:
儲存乙個物件在某乙個時刻的狀態或部分狀態,這樣以後需要時它能夠恢復到先前的狀態。
如果用乙個介面來讓其他物件得到這些狀態,將會暴露物件的實現細節並破壞物件的封裝性,乙個物件不希望外界直接訪問其內部狀態,通過負責人可以間接訪問其內部狀態。
備忘錄模式
備忘錄模式 memento 在不破壞封裝性的前提下,捕獲乙個物件的內部狀態,並在該物件之外儲存這個狀態。這樣以後就可將該物件恢復到原先儲存的狀態。originator 發起人 負責建立乙個備忘錄memento,用以記錄當前時刻它的內部狀態,並可以使用備忘錄恢復內部狀態。originator可根據需要...
備忘錄模式
先從物件導向的三大特徵之一封裝說起。物件導向的封裝簡單點說就是把狀態 資料 和行為 操作這些資料的方法 放到一起,構成乙個單元,通常叫做類。乙個物件的行為是事先確定好的 靜態 一些指令碼,如果物件的狀態相同,物件看起來就是一樣的。所以當我們需要把乙個物件的某一時刻儲存起來,那麼只需要儲存它在那個時刻...
備忘錄模式
面臨問題 物件狀態的變化無端,如何回溯恢復物件在某個點的狀態?在軟體構建過程中,某些物件的狀態在轉換過程中,可能由於某種需要,要求程式能夠回溯到物件之前處於某個點時的狀態。如果使用一些公用介面來讓其他物件得到物件的狀態,便會暴露物件的細節實現。如何實現物件狀態的良好儲存與恢復?但同時又不會因此而破壞...