定義
備忘錄(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可根據需要...
備忘錄模式
先從物件導向的三大特徵之一封裝說起。物件導向的封裝簡單點說就是把狀態 資料 和行為 操作這些資料的方法 放到一起,構成乙個單元,通常叫做類。乙個物件的行為是事先確定好的 靜態 一些指令碼,如果物件的狀態相同,物件看起來就是一樣的。所以當我們需要把乙個物件的某一時刻儲存起來,那麼只需要儲存它在那個時刻...
備忘錄模式
面臨問題 物件狀態的變化無端,如何回溯恢復物件在某個點的狀態?在軟體構建過程中,某些物件的狀態在轉換過程中,可能由於某種需要,要求程式能夠回溯到物件之前處於某個點時的狀態。如果使用一些公用介面來讓其他物件得到物件的狀態,便會暴露物件的細節實現。如何實現物件狀態的良好儲存與恢復?但同時又不會因此而破壞...