設計模式之備忘錄模式

2022-09-01 13:09:11 字數 1717 閱讀 8238

備忘錄模式,屬於行為型設計模式,用於儲存乙個物件的某個狀態,以便在適當的時候恢復物件。

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

問題描述:使用者在誤操作後想取消剛才的操作並且返回到某個歷史狀態。

解決方案:在使用者操作之前儲存一下歷史狀態,當使用者操作後,如果想撤銷操作,那就可以取出事先儲存的歷史狀態來覆蓋當前狀態。

結構圖

舉個栗子:將乙個資料新增和撤銷新增操作的故事。。。

1. 新建乙個原發器類originator,包含一些用於儲存成員資料的屬性。**如下:

2. 新建乙個備忘錄類memento,提供了與原發器相對應的屬性,用於儲存原發器的狀態。**如下:

3. 新建乙個管理者類caretaker,用於儲存備忘錄物件。**如下:

5. 執行後的效果,如圖所示:

以上我們就實現了簡單的撤銷操作功能,但是只能撤銷一次,因為在管理者類中只定義了乙個備忘錄物件來儲存狀態,後面儲存的狀態將會把上次儲存的狀態覆蓋,這樣就只能撤銷一次了。那麼如何實現多次撤銷操作呢?我們可以在管理者類中定義乙個集合來儲存多個備忘錄來儲存歷史狀態,在撤銷時對備忘錄集合進行逆向遍歷,回到乙個指定的狀態,使得物件得到恢復。具體實現方式如下:

以上,我們就實現了多次撤銷的功能。

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

優點

1. 提供了一種狀態恢復的實現機制,使得使用者可以方便地回到乙個特定的歷史狀態;

2. 備忘錄實現了對資訊的封裝,乙個備忘錄物件是一種原發器物件狀態的表示,不會被其他**所改動。

缺點:大量的備忘錄會消耗大量的資源。

適用場景

1. 儲存乙個物件在某一時刻的全部狀態或部分狀態,方便以後它能夠恢復到先前儲存的狀態,實現撤銷操作;

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

設計模式之備忘錄模式

機器 public class machine public void startplay disc.setluminance 60 disc.settime 0 disc.setvolume 80 public void stopplay disc.setluminance 70 disc.set...

設計模式之備忘錄模式

定義 在不破壞封閉的前提下,捕獲乙個物件的內部狀態,並在該物件之外儲存這個狀態。這樣以後就可將該物件恢復到原先儲存的狀態。備忘錄模式有三個角色 以儲存遊戲進度為例,退出遊戲前存檔,再進入遊戲就會顯示退出之前的狀態。示例 遊戲發起人類 public class game public state cr...

設計模式之 備忘錄模式

定義 在不破壞封裝性的前提下,捕獲乙個物件的內部狀態,並在該物件之外儲存這個狀態。這樣就可以將該物件 恢復到原先儲存的狀態。很好理解,就像我們以前打通關遊戲一樣,打通某個關卡,就會備份一下,不然根本通不了關。備忘錄 負責儲存發起人物件的內部狀態,在需要的時候提供發起人需要的內部狀態。public c...