Java備忘錄模式

轉載一個備忘錄模式的實現方法

一、定義:備忘錄(memento)模式又叫快照(snapshot)模式或者token模式,主要功能:
備忘錄模式是用一個對象來存儲另外一個對象的內部狀態的快照,實現備忘錄模式的關鍵點是在不破壞封裝的
情況下,將一個對象的狀態捕捉住,並外部化,存儲起來,從而可以在合適的時候,把這個對象還原。
說明:備忘錄模式適模式中比較好理解的一個,這裏就不舉例子,但是備忘錄模式是模式中實現比較難,或者說
實現比較巧的,這裏主要說說。
二、備忘錄模式的實現
1,備忘錄模式中的角色
發起人:創建含有內部狀態的備忘錄對象,並使用備忘錄對象存儲狀態
負責人:負責人保存備忘錄對象,但不檢查備忘錄對象的內容
備忘錄:備忘錄對象將發起人對象的內部狀態存起來,並保正其內容不被發起人對象之外的對象像讀取
注意:在備忘錄的角色中,定義了他必須對不同的人提供不同的接口,對發起人提供寬接口,對其它任何人提供窄
接口。也許你說我都提供寬接口得了。對這也是備忘錄的一種實現,叫做白箱備忘錄,不過這種方法的封裝沒有設計
好,安全性不夠好。
2,白箱備忘錄的實現:

 

白箱的優點:實現簡單
白箱的缺點:上邊說了,破壞了封裝,安全性有些問題。
說明:這裏白箱的實現只保存了一個狀態,其實是可以保存多個狀態的。
3,雙接口的實現,寬窄接口(黑箱)
如何實現寬窄接口呢,內部類也許是個好方法。我們把備忘錄類設計"成發起人"的內部類,但這樣還有的問題是同一
package中的其它類也能訪問到,爲了解決這個問題,我們可以把"備忘錄"的方法設計成私有的方法,這樣就
可以保正封裝,又保正發起人能訪問到。實現如下:
定義窄接口.

 

ok,實現了對大多數人實現比較窄的接口,對Originator實現了寬接口.
三,最後的一些說明:
1,前邊兩個例子都是記錄了單個狀態(單check點),要實現多個狀態點很容易,只須要把記錄state的字符串換
成一個list,然後添加,取得。如果須要隨機須得狀態點,也可以用map來存放.這樣多個check點就實現了。
2,一般情況下可以擴展負責人的功能,讓負責人的功能更強大,從而讓客戶端的操做更少些。解放客戶端。
3,自述歷史模式,這個就是把發起人,負責人寫在一個類中,平時的應用中這種方法比較常見。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章