撤銷功能的實現——備忘錄模式(五)

Liuwei-Sunny發表於2012-05-02

21.5 再談備忘錄的封裝

      備忘錄是一個很特殊的物件,只有原發器對它擁有控制的權力,負責人只負責管理,而其他類無法訪問到備忘錄,因此我們需要對備忘錄進行封裝。

      為了實現對備忘錄物件的封裝,需要對備忘錄的呼叫進行控制,對於原發器而言,它可以呼叫備忘錄的所有資訊,允許原發器訪問返回到先前狀態所需的所有資料;對於負責人而言,只負責備忘錄的儲存並將備忘錄傳遞給其他物件;對於其他物件而言,只需要從負責人處取出備忘錄物件並將原發器物件的狀態恢復,而無須關心備忘錄的儲存細節。理想的情況是隻允許生成該備忘錄的那個原發器訪問備忘錄的內部狀態。

      在實際開發中,原發器與備忘錄之間的關係是非常特殊的,它們要分享資訊而不讓其他類知道,實現的方法因程式語言的不同而有所差異,在C++中可以使用friend關鍵字,讓原發器類和備忘錄類成為友元類,互相之間可以訪問物件的一些私有的屬性;在Java語言中可以將原發器類和備忘錄類放在一個包中,讓它們之間滿足預設的包內可見性,也可以將備忘錄類作為原發器類的內部類,使得只有原發器才可以訪問備忘錄中的資料,其他物件都無法使用備忘錄中的資料。

 

思考

如何使用內部類來實現備忘錄模式?


21.6 備忘錄模式總結

      備忘錄模式在很多軟體的使用過程中普遍存在,但是在應用軟體開發中,它的使用頻率並不太高,因為現在很多基於窗體和瀏覽器的應用軟體並沒有提供撤銷操作。如果需要為軟體提供撤銷功能,備忘錄模式無疑是一種很好的解決方案。在一些字處理軟體、影象編輯軟體、資料庫管理系統等軟體中備忘錄模式都得到了很好的應用。

 

      1.主要優點

      備忘錄模式的主要優點如下:

      (1)它提供了一種狀態恢復的實現機制,使得使用者可以方便地回到一個特定的歷史步驟,當新的狀態無效或者存在問題時,可以使用暫時儲存起來的備忘錄將狀態復原。

      (2)備忘錄實現了對資訊的封裝,一個備忘錄物件是一種原發器物件狀態的表示,不會被其他程式碼所改動。備忘錄儲存了原發器的狀態,採用列表、堆疊等集合來儲存備忘錄物件可以實現多次撤銷操作。

 

      2.主要缺點

      備忘錄模式的主要缺點如下:

      資源消耗過大,如果需要儲存的原發器類的成員變數太多,就不可避免需要佔用大量的儲存空間,每儲存一次物件的狀態都需要消耗一定的系統資源。

 

      3.適用場景

      在以下情況下可以考慮使用備忘錄模式:

      (1)儲存一個物件在某一個時刻的全部狀態或部分狀態,這樣以後需要時它能夠恢復到先前的狀態,實現撤銷操作。

      (2)防止外界物件破壞一個物件歷史狀態的封裝性,避免將物件歷史狀態的實現細節暴露給外界物件。

 

練習

Sunny軟體公司正在開發一款RPG網遊,為了給玩家提供更多方便,在遊戲過程中可以設定一個恢復點,用於儲存當前的遊戲場景,如果在後續遊戲過程中玩家角色“不幸犧牲”,可以返回到先前儲存的場景,從所設恢復點開始重新遊戲。試使用備忘錄模式設計該功能。

 

【作者:劉偉  http://blog.csdn.net/lovelion

相關文章