1.1概述 在不破壞封裝性的前提下,捕獲一個對象的內部狀態,併在該對象之外保存這個狀態,這樣以後就可以將該對象恢復到原先保存的狀態。這就是備忘錄模式的定義。 對象的狀態依賴於它的變數的取值情況,對象在程式運行期間的各個時刻可能具有不同的狀態。在某些應用中,程式可能需要使用一種合理的方式來保存對象在某 ...
1.1概述
在不破壞封裝性的前提下,捕獲一個對象的內部狀態,併在該對象之外保存這個狀態,這樣以後就可以將該對象恢復到原先保存的狀態。這就是備忘錄模式的定義。
對象的狀態依賴於它的變數的取值情況,對象在程式運行期間的各個時刻可能具有不同的狀態。在某些應用中,程式可能需要使用一種合理的方式來保存對象在某一時刻的狀態,以便在需要時,對象能恢復到原先保存的狀態。在備忘錄模式中,稱需要保存狀態的對象為“原發者”,稱負責保存原發者狀態的對象為“備忘錄”,稱負責管理備忘錄的對象為“負責人”。備忘錄模式要求原發者可以訪問備忘錄中的細節,即可以訪問備忘錄中的數據,以便恢複原發者的狀態,而負責人只能保存和得到備忘錄,但訪問備忘錄中的數據受到一定的限制。備忘錄模式使原發者可以將自己的狀態暴露給備忘錄,但其他對象想要獲得備忘錄中的數據會受到一定的限制,這就保證了原發者暴露內部數據的同時,又保證了數據的封裝性。另外,經過精心設計的備忘錄在保存原發者狀態時,可能只需要保存原發者的部分變數即可,也就是備忘錄通過保存原發者狀態中最本質的數據,就能使原發者根據此備忘錄中的數據恢複原始狀態。
例如,對於一個游戲軟體,該游戲可能需要經過許多關卡才能最後成功,那麼該游戲應當提供保存“游戲關卡”的功能,使游戲玩者在成功完成游戲的某一個關卡之後,保存當前的游戲狀態,當玩到下一個關卡失敗時,可以選擇游戲從上一次保存的狀態開始,即從上一次成功後的關卡開始,而不是再從第1關開始。
1.2模式的結構
備忘錄模式包括以下三種角色:
(1)原發者(Originator):需要在某個時刻保存其狀態的對象。原發者負責創建備忘錄,比如使用createMemento()方法創建一個備忘錄,然後原發者使用該備忘錄記錄自己的狀態。當原發者需要恢復到某個狀態時,它通過獲取備忘錄中相應的數據來恢復到那一時刻的狀態,比如原發者調用restoreFromMemento(Memento mem)方法,並通過參數mem指定備忘錄恢復狀態。
(2)備忘錄(Memento):負責存儲原發者狀態的對象,創建備忘錄的類和創建原發者的類在同一個包中,該類提供的訪問數據的方法都是友好方法,使得只有原發者在用一個包中的類的實例才可以訪問備忘錄中的數據。
(3)負責人(Caretaker):負責管理保存備忘錄中的對象。負責人如果不和原發者在同一個包中就不能對備忘錄中的內容進行修改或讀取。如果需要將備忘錄保存到磁碟,負責人可以使用對象流將備忘錄寫入文件。
備忘錄模式結構的類圖如下所示:
圖一:備忘錄模式的類圖
1.3備忘錄模式的優點
(1)備忘錄模式使用備忘錄可以把原發者的內部狀態保存起來,使只有很“親密的”對象可以訪問備忘錄中的數據。
(2)備忘錄模式強調了類設計單一責任原則,即將狀態的刻畫和保存分開。
1.4適合使用備忘錄模式的情景
(1)必須保存一個對象在某一時刻的全部或部分狀態,以便在需要時恢復該對象先前的狀態。
(2)一個對象不想通過提供public許可權的,諸如getXXX()的方法讓其他對象得到自己的內部狀態。