23種設計模式之備忘錄模式

2021-08-02 04:19:48 字數 2107 閱讀 9687

備忘錄模式是一種行為模式,該模式用於儲存物件當前狀態,並且在之後可以再次恢復到此狀態

此文主要參考《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...