備忘錄模式

2022-01-24 02:08:18 字數 2010 閱讀 8616

解釋:

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

結構圖:

originator(發起人),可根據需要決定memento儲存originator的哪些內部狀態。

memento(備忘錄),有兩個介面,caretaker只能看到備忘錄的窄介面,他只能將備忘錄傳遞給其他物件。originator能夠看到乙個寬介面,允許將它訪問返回到先前狀態所需的所有資料。

caretaker(管理者),不能對備忘錄的內容進行操作、檢查。

客戶端:

優點:

儲存的細節封裝在了memento中,修改、新增、刪除不會影響客戶端**。

缺點:

狀態需要完整儲存到memento中,如果狀態資料很大、很多,則memento物件會非常耗記憶體。不是用的越多越好。

使用環境、場合:

功能複雜,但需要維護、記錄屬性歷史的類,或需要儲存一部分屬性歷史的類。

originator可以根據儲存的memento資訊還原到前一狀態。

使用命令模式的系統中,需要實現命令的撤銷功能,可以使用備忘錄模式來儲存可撤銷操作的狀態。

物件的內部資訊必須儲存在物件以外的地方,但必須由物件自己讀取。使用備忘錄模式可以把複雜的物件內部資訊對其他的物件遮蔽起來,從而可以恰當第保持封裝的邊界。

當狀態改變時,有可能這個狀態會撤銷,導致無效,這時可以使用memento將狀態復原。

使用建議:

儲存全部資訊時,用originator例項來做狀態備份可以考慮,但是用clone的方式來實現狀態備份可能是更好的辦法。缺點是:對上層應用開放了originator的全部(public)介面,不合適。

不需要備份全部狀態資訊時,只是部分,應該有乙個獨立的memento類,只擁有需要儲存的資訊的屬性。

應用:

1.遊戲狀態的各種引數儲存,以便日後讀取。(儲存在磁碟上)

2.常規應用:悔棋、文件撤銷操作、網頁後退,頻繁、簡單的恢復。(儲存在記憶體中)

示例:

客戶端**:

對比:

客戶端暴露了實現細節,不可取。

擴充套件:

**無錯未必優。

不能將功能細節暴露給客戶端。否則,客戶端責任太大。增加、修改時困難。

備忘錄模式

備忘錄模式 memento 在不破壞封裝性的前提下,捕獲乙個物件的內部狀態,並在該物件之外儲存這個狀態。這樣以後就可將該物件恢復到原先儲存的狀態。originator 發起人 負責建立乙個備忘錄memento,用以記錄當前時刻它的內部狀態,並可以使用備忘錄恢復內部狀態。originator可根據需要...

備忘錄模式

先從物件導向的三大特徵之一封裝說起。物件導向的封裝簡單點說就是把狀態 資料 和行為 操作這些資料的方法 放到一起,構成乙個單元,通常叫做類。乙個物件的行為是事先確定好的 靜態 一些指令碼,如果物件的狀態相同,物件看起來就是一樣的。所以當我們需要把乙個物件的某一時刻儲存起來,那麼只需要儲存它在那個時刻...

備忘錄模式

面臨問題 物件狀態的變化無端,如何回溯恢復物件在某個點的狀態?在軟體構建過程中,某些物件的狀態在轉換過程中,可能由於某種需要,要求程式能夠回溯到物件之前處於某個點時的狀態。如果使用一些公用介面來讓其他物件得到物件的狀態,便會暴露物件的細節實現。如何實現物件狀態的良好儲存與恢復?但同時又不會因此而破壞...