解釋:
在不破壞封裝性的前提下,捕獲一個對象的内部狀态,并在該對象之外儲存這個狀态。這樣以後就可将該對象恢複到原先儲存的狀态。
結構圖:

Originator(發起人),可根據需要決定Memento存儲Originator的哪些内部狀态。
Memento(備忘錄),有兩個接口,Caretaker隻能看到備忘錄的窄接口,他隻能将備忘錄傳遞給其他對象。Originator能夠看到一個寬接口,允許将它通路傳回到先前狀态所需的所有資料。
Caretaker(管理者),不能對備忘錄的内容進行操作、檢查。
用戶端:
優點:
儲存的細節封裝在了Memento中,修改、添加、删除不會影響用戶端代碼。
缺點:
狀态需要完整存儲到Memento中,如果狀态資料很大、很多,則Memento對象會非常耗記憶體。不是用的越多越好。
使用環境、場合:
功能複雜,但需要維護、記錄屬性曆史的類,或需要儲存一部分屬性曆史的類。
Originator可以根據儲存的Memento資訊還原到前一狀态。
使用指令模式的系統中,需要實作指令的撤銷功能,可以使用備忘錄模式來存儲可撤銷操作的狀态。
對象的内部資訊必須儲存在對象以外的地方,但必須由對象自己讀取。使用備忘錄模式可以把複雜的對象内部資訊對其他的對象屏蔽起來,進而可以恰當第保持封裝的邊界。
當狀态改變時,有可能這個狀态會撤銷,導緻無效,這時可以使用Memento将狀态複原。
使用建議:
儲存全部資訊時,用Originator執行個體來做狀态備份可以考慮,但是用clone的方式來實作狀态備份可能是更好的辦法。缺點是:對上層應用開放了Originator的全部(public)接口,不合适。
不需要備份全部狀态資訊時,隻是部分,應該有一個獨立的Memento類,隻擁有需要儲存的資訊的屬性。
應用:
1.遊戲狀态的各種參數存儲,以便日後讀取。(儲存在磁盤上)
2.正常應用:悔棋、文檔撤銷操作、網頁後退,頻繁、簡單的恢複。(儲存在記憶體中)
示例:
用戶端代碼:
對比:
用戶端暴露了實作細節,不可取。
擴充:
代碼無錯未必優。
不能将功能細節暴露給用戶端。否則,用戶端責任太大。增加、修改時困難。