別把一輩子過成一天。
簡介備忘錄模式是屬於行為型設計模式的一種。
該模式的核心思想是在不破壞封裝性的前提下,捕獲一個物件的內部狀態,並且在該物件之外儲存捕獲到的狀態。這樣做的意義是確保以後可以隨時將該物件恢復到原來儲存的某一狀態時。
通俗點說備忘錄模式就是透過一種特定的手段來記錄一個物件的某一狀態,或者是該物件的某些資料,當要做回退時,可以輕鬆的從備忘錄中獲取原來的狀態、資料並進行恢復。
備忘錄模式UML類圖
類圖講解
Originator:原始物件,也可理解為需要做備忘的物件。Memento:備忘錄物件,該類的作用就是記錄Originator的內容。Caretaker:守護者物件,用於維護所有的Memento物件。Client:客戶端測試類。
案例講解
案例:透過程式碼模擬平時我們進行撤回的操作。
備忘錄類
public class Memento { // 資料 private String data; public Memento(String data) { this.data = data; } public String getData() { return data; }}
原始物件
public class Originator { // 資料 private String data; public String getData() { return data; } public void setData(String data) { this.data = data; } // 建立備忘錄物件 public Memento createMemento() { return new Memento(data); } // 根據備忘錄物件進行恢復 public void recover(Memento memento) { data = memento.getData(); }}
守護者類
public class Caretaker { private List<Memento> mementos = new ArrayList<>(); // 新增一個備忘錄物件 public void add(Memento memento) { mementos.add(memento); } // 獲取最近一次儲存的備忘錄物件 public Memento obtain() { return mementos.get(mementos.size() - 1); }}
客戶端測試類
public class Client { public static void main(String[] args) { Originator originator = new Originator(); originator.setData("第一次:初始化"); System.out.println(originator.getData()); // 進行備忘 Memento memento = originator.createMemento(); Caretaker caretaker = new Caretaker(); caretaker.add(memento); // 修改資料 originator.setData("第二次:進行修改"); System.out.println(originator.getData()); // 還原資料 System.out.println("進行還原"); originator.recover(caretaker.obtain()); System.out.println(originator.getData()); }}
執行結果

1、備忘錄模式給使用者提供了一種可恢復的機制,使得使用者能夠方便地回到某個歷史的狀態。
2、備忘錄模式進行了資訊的封裝,使用者使用時不需要關心狀態儲存的細節。
3、類的成員變數過多的話進行備份肯定會佔用較大的資源,並且每一次的儲存都會消耗一定的記憶體。
4、備忘錄模式可以和原型模式配合使用,進而可以節約資源。
