設計模式之備忘錄模式

2021-08-28 23:37:25 字數 3235 閱讀 1346

備份物件狀態,以便恢復到上乙個狀態。 通俗來說就是在物件(originator發起人)執行某個動作之前先將狀態(屬性值)拷貝乙份到乙個備忘錄(memento備忘錄)物件中,並且由乙個管理者(caretaker管理者)保管。 然後物件執行動作,執行完後又想要回到執行動作之前的狀態,那麼就是將被備忘錄物件屬性值重新再賦值給該物件。 如果想要永久持久化則資料放到磁碟中,而非記憶體中。

也就是說在管理者可以訪問儲存的備忘錄的方法進而可以檢視其屬性值,並且同樣可以修改其屬性,這是不安全且不合理,按正常邏輯管理者只對備忘錄進行儲存,而發起類可以對備忘錄中的屬性進行訪問。

和上面白盒模式不同就是,備忘錄中的資訊對於管理者來說完全遮蔽,就相當於乙個黑盒子樣什麼也看不到,然而為了保證備忘錄僅僅存放的發起人相關的狀態,所以把備忘錄類作為發起人類的私有內部類。下面類圖和**就是黑盒模式並且也推薦使用其模式。

這個就是我們之前介紹的原型模式,也就是發起人實現其cloneable介面,並且生成乙個新的物件,其中如果是引用型別要考慮是否需要深度轉殖,具體詳情可以檢視之前講解的原型模式。

這樣就可以不需要使用備忘錄類了,這種模式不推薦使用,因為我們備份物件的狀態可以就是幾個屬性值,而使用轉殖方式可以僅僅轉殖幾個屬性,但是如果這個時候我們又需要使用轉殖進行複製乙個完整物件(所有屬性值),這個時候乙個轉殖方式不能滿足兩種需求。 這個和我們的單一職責相違背了。

irolestatememento:備忘錄介面(為了避免管理者caretaker訪問到其備忘錄類中的屬性,該介面是乙個空介面沒有任何方法)

rolestatememento:具體備忘錄類 (memento)

rolestatecaretaker:備忘錄管理者(caretaker)

role:遊戲角色類 (originator 發起人)

client:客戶端測試

irolestatememento 備忘錄介面

/**

* @author duanyimiao

* @create 2018-10-11 8:30 pm

* @description 為了保證管理備忘錄類不能操作和獲取其內部資料,此時的屬性需要使用乙個沒有實現方法的介面,並且該介面由rolestatememento類實現

**/public

inte***ce

irolestatememento

role 遊戲角色類(裡面包含了乙個備忘錄類)

/**

* @author duanyimiao

* @create 2018-10-11 8:05 pm

* @description 遊戲角色類(originator發起人)

**/public

class

role

public rolestatememento createrolestatememento()

public

void

setrolestatememento

(irolestatememento irolestatememento)

public

void

fight()

public

void

displaystate()

public

intgetvitality()

public

void

setvitality

(int vitality)

public

intgetattack()

public

void

setattack

(int attack)

public

intgetdefense()

public

void

setdefense

(int defense)

/** * 角色狀態備忘錄類(memento 備忘錄類)

*/private

class

rolestatememento

implements

irolestatememento

public

intgetvitality()

public

void

setvitality

(int vitality)

public

intgetattack()

public

void

setattack

(int attack)

public

intgetdefense()

public

void

setdefense

(int defense)

}}

rolestatecaretaker 備忘錄管理者(裡面包含乙個由備忘錄實現的介面)

/**

* @author duanyimiao

* @create 2018-10-11 8:11 pm

* @description 管理備忘錄的類(caretaker 備忘錄管理類)

**/public

class

rolestatecaretaker

public irolestatememento retrieverolestatememento()

}

client 客戶端測試類

/**

* @author duanyimiao

* @create 2018-10-11 8:17 pm

* @description

**/public

class

client

}

輸出結果

vitality=

100 attack=

100 defense=

100vitality=

0 attack=

0 defense=

0vitality=

100 attack=

100 defense=

100

設計模式之備忘錄模式

機器 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...