天天看點

備忘錄模式

解釋:

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

結構圖:

  

備忘錄模式

  Originator(發起人),可根據需要決定Memento存儲Originator的哪些内部狀态。

備忘錄模式

  Memento(備忘錄),有兩個接口,Caretaker隻能看到備忘錄的窄接口,他隻能将備忘錄傳遞給其他對象。Originator能夠看到一個寬接口,允許将它通路傳回到先前狀态所需的所有資料。

備忘錄模式
備忘錄模式

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

備忘錄模式

  用戶端:

備忘錄模式

優點:

  儲存的細節封裝在了Memento中,修改、添加、删除不會影響用戶端代碼。

缺點:

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

使用環境、場合:

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

  Originator可以根據儲存的Memento資訊還原到前一狀态。

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

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

  當狀态改變時,有可能這個狀态會撤銷,導緻無效,這時可以使用Memento将狀态複原。

使用建議:

  儲存全部資訊時,用Originator執行個體來做狀态備份可以考慮,但是用clone的方式來實作狀态備份可能是更好的辦法。缺點是:對上層應用開放了Originator的全部(public)接口,不合适。

  不需要備份全部狀态資訊時,隻是部分,應該有一個獨立的Memento類,隻擁有需要儲存的資訊的屬性。

應用:

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

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

示例:

備忘錄模式

  用戶端代碼:

備忘錄模式

  對比:

  用戶端暴露了實作細節,不可取。

備忘錄模式
備忘錄模式
備忘錄模式

擴充:

  代碼無錯未必優。

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

上一篇: 通用TryParse
下一篇: 通用視圖

繼續閱讀