備忘錄模式

2021-09-14 06:36:14 字數 1918 閱讀 9700

備忘錄模式(memento pattern)儲存乙個物件的某個狀態,以便在適當的時候恢復物件。

意圖:在不破壞封裝性的前提下,捕獲乙個物件的內部狀態,並在該物件之外儲存這個狀態。

主要解決:所謂備忘錄模式就是在不破壞封裝的前提下,捕獲乙個物件的內部狀態,並在該物件之外儲存這個狀態,這樣可以在以後將物件恢復到原先儲存的狀態。

何時使用:很多時候我們總是需要記錄乙個物件的內部狀態,這樣做的目的就是為了允許使用者取消不確定或者錯誤的操作,能夠恢復到他原先的狀態,使得他有"後悔藥"可吃。

如何解決:通過乙個備忘錄類專門儲存物件狀態。

關鍵**:客戶不與備忘錄類耦合,與備忘錄管理類耦合。

優點:1、給使用者提供了一種可以恢復狀態的機制,可以使使用者能夠比較方便地回到某個歷史的狀態。 2、實現了資訊的封裝,使得使用者不需要關心狀態的儲存細節。

缺點:消耗資源。如果類的成員變數過多,勢必會占用比較大的資源,而且每一次儲存都會消耗一定的記憶體。

注意事項:1、為了符合迪公尺特原則,還要增加乙個管理備忘錄的類。 2、為了節約記憶體,可使用原型模式+備忘錄模式。

備忘錄模式的主要角色如下

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

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

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

備忘錄模式的結構圖如圖所示:

* @description: 備忘錄

* @author: ljx

* @date: 2023年4月1日 下午5:22:46

*/public class memento

public string getstatus()

public void setstatus(string status)

}/**

* * @classname: originator

* @description: 發起人

* @author: ljx

* @date: 2023年4月1日 下午5:22:36

*/public class originator

public void setstatus(string status)

public memento createmenento()

public void restormenento(memento m)

}/**

* * @classname: caretaker

* @description: 管理者

* @author: ljx

* @date: 2023年4月1日 下午5:22:23

*/public class caretaker

public void setmemento(memento memento) }

public class mementotest

}結果:

初始狀態第乙個記錄

新的狀態:第二個記錄

恢復狀態:第乙個記錄

... ...,歡迎指正!

備忘錄模式

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

備忘錄模式

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

備忘錄模式

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