備忘錄模式

2021-10-03 23:19:47 字數 2529 閱讀 2816

定義

備忘錄(memento)模式又叫快照模式,在不破壞封裝性的前提下,捕獲乙個物件的內部狀態,並在該物件之外儲存這個狀態,以便以後當需要時能將該物件恢復到原先儲存的狀態。

備忘錄模式屬於物件行為型模式。

要點優點:

提供了一種可以恢復狀態的機制。當使用者需要時能夠比較方便地將資料恢復到某個歷史的狀態。

實現了內部狀態的封裝。除了建立它的發起人之外,其他物件都不能夠訪問這些狀態資訊。

簡化了發起人,發起人不需要管理和儲存其內部狀態的各個備份,所有狀態資訊都儲存在備忘錄中,並由管理者進行管理,這符合單一職責原則。

缺點:資源消耗大。如果要儲存的內部狀態資訊過多或者特別頻繁,將會占用比較大的記憶體資源。

主要角色:

發起人(originator):記錄當前時刻的內部狀態資訊,提供建立備忘錄和恢復備忘錄資料的功能,實現其他業務功能,它可以訪問備忘錄裡的所有資訊。

備忘錄(memento):負責儲存發起人的內部狀態,在需要的時候提供這些內部狀態給發起人。

管理者(caretaker):對備忘錄進行管理,提供儲存與獲取備忘錄的功能,但其不能對備忘錄的內容進行訪問與修改。

場景memento

/**

* 備忘錄

*/public

class

memento

public integer getcheckpoint()

public

void

setcheckpoint

(integer checkpoint)

@override

public

boolean

equals

(object o)

@override

public

inthashcode()

@override

public string tostring()

';}}

caretaker

/**

* 備忘錄管理類(存檔)

*/public

class

caretaker

/** * 恢復存檔

*/public memento restorememento()

}

game

/**

* 遊戲,相當於originator

*/public

class

game

public

game

(memento memento)

public

void

play()

/** * 猜拳

*/private

void

fingerguess()

system.out.

println

("你輸入的手勢有誤,請重新輸入:");

usergesture = scanner.

next()

;}// 使用者手勢和系統手勢比較

if(rock.

equals

(usergesture))}

else

if(scissors.

equals

(usergesture))}

else}}

/** * 生成系統手勢

*/private string getsystemgesture()

return systemgesture;

}/**

* 進入下一關

*/private

void

nextcheckpoint()

/** * 退出遊戲並存檔

*/public memento quitandarchive()

/** * 開始遊戲並讀取存檔

*/public

void

beginandrestore

(memento memento)

}

client

public

class

client

}

原始碼click here 總結

適用場景:

需要儲存與恢復資料的場景,如玩遊戲時的中間結果的存檔功能。

需要提供乙個可回滾操作的場景,如 word、記事本、photoshop,eclipse 等軟體在編輯時按 ctrl+z 組合鍵,還有資料庫中事務操作。

需要保證被儲存的物件狀態不能被外部訪問,保證內部完整性,不向第三方透露。

在不破壞封閉的前提下,捕獲乙個物件的內部狀態,並在該物件之外儲存這個狀態,以便恢復到原先儲存的狀態。

備忘錄模式

備忘錄模式 memento 在不破壞封裝性的前提下,捕獲乙個物件的內部狀態,並在該物件之外儲存這個狀態。這樣以後就可將該物件恢復到原先儲存的狀態。originator 發起人 負責建立乙個備忘錄memento,用以記錄當前時刻它的內部狀態,並可以使用備忘錄恢復內部狀態。originator可根據需要...

備忘錄模式

先從物件導向的三大特徵之一封裝說起。物件導向的封裝簡單點說就是把狀態 資料 和行為 操作這些資料的方法 放到一起,構成乙個單元,通常叫做類。乙個物件的行為是事先確定好的 靜態 一些指令碼,如果物件的狀態相同,物件看起來就是一樣的。所以當我們需要把乙個物件的某一時刻儲存起來,那麼只需要儲存它在那個時刻...

備忘錄模式

面臨問題 物件狀態的變化無端,如何回溯恢復物件在某個點的狀態?在軟體構建過程中,某些物件的狀態在轉換過程中,可能由於某種需要,要求程式能夠回溯到物件之前處於某個點時的狀態。如果使用一些公用介面來讓其他物件得到物件的狀態,便會暴露物件的細節實現。如何實現物件狀態的良好儲存與恢復?但同時又不會因此而破壞...