設計模式學習筆記(二十二 備忘錄模式)

2021-09-02 17:18:15 字數 1420 閱讀 8615

在不破壞封裝性的前提下,捕獲乙個物件的內部狀態,並在該物件之外儲存這個狀態,這樣以後就可以將該物件恢復到原先儲存的狀態。這就是備忘錄模式的定義。

物件的狀態依賴於它的變數的取值情況,物件在程式執行期間的各個時刻可能具有不同的狀態。在某些應用中,程式可能需要使用一種合理的方式來儲存物件在某一時刻的狀態,以便在需要時,物件能恢復到原先儲存的狀態。在備忘錄模式中,稱需要儲存狀態的物件為「原發者」,稱負責儲存原發者狀態的物件為「備忘錄」,稱負責管理備忘錄的物件為「負責人」。備忘錄模式要求原發者可以訪問備忘錄中的細節,即可以訪問備忘錄中的資料,以便恢復原發者的狀態,而負責人只能儲存和得到備忘錄,但訪問備忘錄中的資料受到一定的限制。備忘錄模式使原發者可以將自己的狀態暴露給備忘錄,但其他物件想要獲得備忘錄中的資料會受到一定的限制,這就保證了原發者暴露內部資料的同時,又保證了資料的封裝性。另外,經過精心設計的備忘錄在儲存原發者狀態時,可能只需要儲存原發者的部分變數即可,也就是備忘錄通過儲存原發者狀態中最本質的資料,就能使原發者根據此備忘錄中的資料恢復原始狀態。

例如,對於乙個遊戲軟體,該遊戲可能需要經過許多關卡才能最後成功,那麼該遊戲應當提供儲存「遊戲關卡」的功能,使遊戲玩者在成功完成遊戲的某乙個關卡之後,儲存當前的遊戲狀態,當玩到下乙個關卡失敗時,可以選擇遊戲從上一次儲存的狀態開始,即從上一次成功後的關卡開始,而不是再從第1

關開始。

備忘錄模式包括以下三種角色:

(1)原發者(originator):需要在某個時刻儲存其狀態的物件。原發者負責建立備忘錄,比如使用

creatememento()

restorefrommemento(memento mem)

方法,並通過引數

mem指定備忘錄恢復狀態。

(2)備忘錄(memento):負責儲存原發者狀態的物件,建立備忘錄的類和建立原發者的類在同乙個包中,該類提供的訪問資料的方法都是友好方法,使得只有原發者在用乙個包中的類的例項才可以訪問備忘錄中的資料。

(3)負責人(caretaker):負責管理儲存備忘錄中的物件。負責人如果不和原發者在同乙個包中就不能對備忘錄中的內容進行修改或讀取。如果需要將備忘錄儲存到磁碟,負責人可以使用物件流將備忘錄寫入檔案。

備忘錄模式結構的類圖如下所示:

圖一:備忘錄模式的類圖

(1)備忘錄模式使用備忘錄可以把原發者的內部狀態儲存起來,使只有很「親密的」物件可以訪問備忘錄中的資料。

(2)備忘錄模式強調了類設計單一責任原則,即將狀態的刻畫和儲存分開。

(1)必須儲存乙個物件在某一時刻的全部或部分狀態,以便在需要時恢復該物件先前的狀態。

(2)乙個物件不想通過提供

public

許可權的,諸如

get***()

的方法讓其他物件得到自己的內部狀態。

二十 備忘錄模式

備忘錄模式 memento 在不破壞封裝性的前提下,捕獲乙個物件內部狀態,並在該物件之外儲存這個狀態。以便將物件恢復到原先儲存狀態。demo 備忘錄模式 class program static void main string args originator o new originator o....

設計模式學習筆記 備忘錄模式

定義 在不破壞封裝性的前提下,捕獲乙個物件的內部狀態,並在該物件之外儲存這個狀態,這樣以後就可以將該物件恢復到原先儲存的狀態。備忘錄模式主要是對某個物件的狀態的備份,備份的主要是物件當前的屬性值,即成員變數的值,成員變數可以有多個,而且可以備份同乙個物件的多種不同狀態,即同乙個物件可以同時有多個備份...

《設計模式》學習筆記 備忘錄模式

備忘錄模式 memento pattern 儲存乙個物件的某個狀態,以便在適當的時候恢復物件。備忘錄模式屬於行為型模式。意圖 在不破壞封裝性的前提下,捕獲乙個物件的內部狀態,並在該物件之外儲存這個狀態。主要解決 所謂備忘錄模式就是在不破壞封裝的前提下,捕獲乙個物件的內部狀態,並在該物件之外儲存這個狀...