備忘錄模式是一種行為模式,該模式用於儲存物件當前的狀態,並且在之後可以再次恢復到此狀態,這有點像我們平時說的「後悔藥」。備忘錄模式實現的方式需要保證被儲存的物件狀態不嗯呢該被物件從外部訪問,目的是為了保護號被儲存的這些物件狀態的完整性以及內部實現不向外暴露。
在不破壞封閉的前提下,捕獲乙個物件的內部狀態,並在該物件之外儲存這個狀態,這樣,以後就可將該物件恢復到原先儲存的狀態。
說白了它主要應用在:物件在執行某些操作為防止意外而在執行操作前將物件狀態備份的場景,有點類似於事務回滾的意思。
角色介紹:
對於備忘錄模式來說,比較貼切的場景應該是遊戲中的存檔功能,該功能就是將遊戲進度儲存到本地檔案系統或者資料庫中,下次再次進入時從本地載入進度,使得玩家能夠繼續上一次的遊戲之旅。這裡我們以遊戲存檔為例來簡單演示一下備忘錄模式的實現。
首先我們建立遊戲類、備忘錄類、caretaker(管理)類,玩遊戲到某個節點對遊戲進行存檔,然後退出遊戲,再次進入遊戲時從存檔中讀取進度,並且存檔時的進度:
先看遊戲類:
public
class game
//退出遊戲
public
void
quit()
//建立備忘錄
public memento creatememento()
//恢復遊戲
public
void
restore(memento memento)
}
在 game 遊戲類中國,我們儲存了幾個關鍵字段(也就是所謂的狀態),玩家的姓名以及當前通過的關卡。當呼叫 play 函式時表示開始進行遊戲,沒呼叫一次表示通過乙個關卡。在該類中可以通過 creatememento 函式來建立當前使用者的遊戲進度(備忘錄物件),也就是將自身的狀態儲存到乙個 memento 物件中。外部可以通過 restore 函式將 game 物件的狀態從備忘錄物件中恢復。
我們再來看看備忘錄物件,它只是儲存 game 物件的字段(狀態資訊),具體**如下:
public
class memento
public
void
setname(string name)
public
intgetposition()
public
void
setposition(int position)
}
這個類只用來負責儲存 originator(發起人)角色的一些資料,防止外部直接訪問 originator 內部的狀態。
而負責人的角色則為 caretaker 角色,我們來看下它都做了什麼操作:
public
class caretaker
//獲取存檔
public memento restorememento()
}
caretaker 類的職責很簡單,就是負責管理 memento 物件,也就是備忘錄物件。
我們再來看一下客戶端**的實現:
//構建遊戲物件
game game = new game();
//打遊戲
game.play(); //通過關卡 1
game.play(); //通過關卡 2
game.play(); //通過關卡 3
game.play(); //通過關卡 4
game.play(); //通過關卡 5
//不玩了 存檔
caretaker caretaker = new caretaker();
caretaker.storememento(game.creatememento());
//突然又想玩了繼續玩...
game.play(); //通過關卡 6
game.play(); //通過關卡 7
game.play(); //通過關卡 8
//突然斷電,恢復遊戲(從遊戲存檔中繼續遊戲進度)
game.restore(caretaker.restorememento()); //恢復到關卡 5
game 在這裡為 originator 角色,也就是需要儲存資料的物件,在這裡並沒有直接儲存 game 物件,而是通過 memento 對 game 物件的資料進行儲存,然後再儲存 memento 物件,最終對 memento 的儲存操作則交給 caretaker 物件。在這個過程中,各個角色職責清晰、單一,**也比較簡單,既對外遮蔽了對 game 角色狀態的直接訪問,在滿足了物件狀態訪問功能的同時也使得該模組的結構保持清晰、整潔。
備忘錄模式是在不破壞封裝的條件下,通過備忘錄物件(memento)儲存另外乙個物件內部狀態的快照,在將來合適的時候把這個物件還原到儲存起來的狀態。優點
缺點
java設計模式 備忘錄模式
備忘錄模式 定義 在不破壞封閉的前提下,捕獲乙個物件的內部狀態,並在該物件之外儲存這個狀態。這樣以後就可將該物件恢復到原先儲存的狀態。涉及角色 1.originator 發起人 負責建立乙個備忘錄memento,用以記錄當前時刻自身的內部狀態,並可使用備忘錄恢復內部狀態。originator可以根據...
設計模式之備忘錄模式
機器 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...