備忘錄模式(Memento Pattern)又稱為快照(Snapshot)模式或Token模式。 意思是:在不破壞封裝性的前提下,捕獲一個對象的內部狀態,併在該對象之外保存這個對象。這樣,以後就可以將該對象恢復到原先保存的狀態。 通俗地說,備忘錄模式就是將一個對象進行備份,提供一種程式數據的備份方法 ...
備忘錄模式(Memento Pattern)又稱為快照(Snapshot)模式或Token模式。
意思是:在不破壞封裝性的前提下,捕獲一個對象的內部狀態,併在該對象之外保存這個對象。這樣,以後就可以將該對象恢復到原先保存的狀態。
通俗地說,備忘錄模式就是將一個對象進行備份,提供一種程式數據的備份方法,其類圖如下。
備忘錄模式中有如下3個角色:
- 發起人(Originator)角色:記錄當前時刻的內部狀態,負責定義哪些屬於備份範圍的狀態,負責創建和恢復備忘數據。
- 備忘錄(Memento)角色:負責存儲發起人的內部狀態,在需要時提供發起人需要的內部狀態數據。
- 負責人(Caretaker)角色:對備忘錄角色進行管理、保存和提供備忘錄。
Originator.java
// 發起人角色 public class Originator { // 內部狀態 private String state = ""; public String getState() { return state; } public void setState(String state) { this.state = state; } // 創建備忘錄 public Memento createMemento() { return new Memento(this.state); } // 恢復一個備忘錄 public void restorMemento(Memento memento) { this.setState(memento.getState()); } }
Memento.java
// 備忘錄角色 public class Memento { // 發起人的內部狀態 private String state; // 構造函數傳遞參數 public Memento(String state) { this.state = state; } public String getState() { return state; } public void setState(String state) { this.state = state; } }
Caretaker.java
// 負責人角色 public class Caretaker { // 備忘錄對象 private Memento memento; public Memento getMemento() { return memento; } public void setMemento(Memento memento) { this.memento = memento; } }
Client.java
// 負責人角色 public class Caretaker { // 備忘錄對象 private Memento memento; public Memento getMemento() { return memento; } public void setMemento(Memento memento) { this.memento = memento; } }
應用場景:
- 需要保存和恢複數據的相關狀態場景。
- 提供一個可回滾的操作。
- 需要監控副本的場景,例如,監控一個對象的屬性,但是監控又不應該作為系統的主業務來調用,它只是邊緣作用,即使出現監控不准、錯誤報警也影響不大,因此一般做法是備份一個主線程中的對象,然後由分析程式來分析。
- 資料庫連接的事務管理使用的就是備忘錄模式。
註意事項:
- 備忘錄的生命周期,備忘錄創建出來就要在最近的代碼中使用,要主動管理它的生命周期,建立就要使用,不使用就要立刻刪除其引用,等待垃圾回收器對它的回收處理。
- 備忘錄的性能。不要豐頻繁建立備份的場景中使用備忘錄模式,例如,for迴圈中,一是控制不了備忘錄建立 的數據數量;二是大對象的建立是要消耗資源的,需要考慮系統的性能。因此,如果出現這樣的代碼,設計師就應該修改架構。