備忘錄模式是一種行為模式,該模式用於儲存物件當前狀態,並且在之後可以再次恢復到此狀態備忘錄模式的定義在不破壞封閉的前提下,捕獲乙個物件的內部狀態,並在該物件之外儲存這個狀態,這樣,以後就可將該物件恢復到原先儲存的狀態。此文主要參考《android原始碼設計模式解析與實戰》一書
備忘錄模式的使用場景
a.需要儲存乙個物件在某乙個時刻的狀態或部分狀態
b.如果用乙個藉口來讓其他物件得到這些狀態,將會暴露物件的實現細節並破壞物件的封裝性,乙個物件不希望外界直接訪問其內部狀態,通過中間物件可以間接訪問其內部狀態。
備忘錄模式的uml類圖
角色介紹:
originator:負責建立乙個備忘錄,可以記錄、恢復自身的內部狀態。同時originator還可以根據需要決定memento儲存自身的哪些內部狀態。
memento:備忘錄角色,用於儲存originator的內部狀態,並且可以防止originato以外的物件訪問memento。
caretaker:負責儲存備忘錄,不能對備忘錄的內部進行操作和訪問,只能夠將備忘錄傳遞給其他物件。
原始碼實現
//使命召喚遊戲
public
class callofduty
//退出遊戲
public
void
quit()
//建立備忘錄
public memoto creatememoto()
//恢復遊戲
public
void
restore(memoto memoto)
@override
public string tostring() ';}}
callofduty遊戲類中,儲存一些關鍵的字段,關卡,人物的生命值、**等。當呼叫play()方法時對屬性進行修改,在creatememoto()函式中來建立備忘錄物件,對自身狀態進行儲存。外部可以通過restore()函式將callofduty物件的狀態從備忘錄物件中恢復。
下面是備忘錄的類:
//備忘錄類
public
class memoto ';}}
//負責管理memoto
public
class caretaker
//獲取存檔
public memoto getmmemoto()
}
caretaker類的職責很簡單,就是負責管理memoto物件,也就是備忘錄物件。
ok,所有事情準備就緒,現在看下客戶端的**:
public
class client
}
執行結果:
玩遊戲:第1關奮戰殺敵中
進度公升級了
到達第2關
-------------------
退出前的遊戲熟悉:callofduty
退出遊戲
-------------------
恢復後的遊戲屬性:callofduty
在這個過程中,各個角色職責清晰、單一,**也比較簡單,即對外遮蔽了對callofduty角色的直接訪問,在滿足了物件狀態訪問功能的同時也使得該模組的結構保持清晰、整潔。
總結
備忘錄模式是在不破壞封裝的條件下,通過備忘錄物件(memoto)儲存另外乙個物件內部狀態的快照,在將來合適的時候把這個物件還原到儲存起來的狀態。
優點
缺點
消耗資源,如果類的成員變數過多,勢必會占用比較大的資源,而且每一次儲存都會消耗一定的資源。
23種設計模式之備忘錄模式(21)
備忘錄 memento 在不破壞封裝性的前提下,捕獲乙個物件的內部狀態,並在該物件之外儲存這個狀態。這樣以後就可將該物件恢復到原先儲存的狀態。發起人 originator 類 date 2020 9 24 public class originator public void setstate st...
23設計模式之備忘錄模式 Memento
memento屬於行為型模式中的一種,在不破壞封裝性的前提下,捕獲乙個物件的內部狀態,並在該物件之外儲存這個狀態。這樣以後就可將該物件恢復到原先儲存的狀態。必須儲存乙個物件在某乙個時刻的 部分 狀態,這樣以後需要時它才能恢復到先前的狀態。如果乙個用介面來讓其它物件直接得到這些狀態,將會暴露物件的實現...
設計模式之備忘錄模式
機器 public class machine public void startplay disc.setluminance 60 disc.settime 0 disc.setvolume 80 public void stopplay disc.setluminance 70 disc.set...