備忘錄設計模式
- 🚩什么是備忘錄設計模式?
- 🚩備忘錄設計模式的特點
- 🚩備忘錄設計模式的結構
- 🚩備忘錄設計模式的優缺點
- 🚩備忘錄設計模式的Java實現
- 🚩代碼總結
- 🚩總結
🚩什么是備忘錄設計模式?
備忘錄設計模式(Memento Pattern) 是一種 行為型設計模式,用于在不破壞對象封裝性的前提下,捕獲對象的內部狀態,并在未來的某個時間點恢復到該狀態。該模式可以幫助我們實現 撤銷(Undo) 操作,常用于文本編輯器、事務管理等場景。
使用場景
-
需要 保存和恢復對象的狀態,比如 撤銷/重做 功能
-
需要 防止外部對象直接訪問對象的私有狀態,保持封裝性
-
需要 在歷史記錄中存儲對象的多個狀態,支持回溯
🚩備忘錄設計模式的特點
-
封裝性:對象的狀態被存儲在備忘錄中,避免外部訪問
-
狀態恢復:允許對象恢復到之前的狀態,支持回溯操作
-
簡化歷史記錄管理:可以存儲多個歷史狀態,支持撤銷、重做等功能
-
解耦設計:原發器(Originator)與管理者(Caretaker)解耦,原發器只負責創建和恢復狀態,管理者負責存儲
🚩備忘錄設計模式的結構
備忘錄模式主要包含以下部分:
-
Originator(原發器):負責創建備忘錄(Memento)并存儲當前狀態,支持從備忘錄恢復狀態
-
Memento(備忘錄):存儲原發器的狀態,并提供恢復該狀態的方法
-
Caretaker(管理者):負責存儲多個備忘錄對象,可以提供回溯功能
圖例:
🚩備忘錄設計模式的優缺點
? 優點
-
封裝性好,外部對象無法直接訪問對象的狀態
-
支持撤銷和重做功能,適用于編輯器、事務管理等場景
-
解耦原發器和管理者,增強了代碼的可維護性
? 缺點
-
內存消耗大,如果存儲大量狀態,可能會影響系統性能
-
狀態存儲復雜,如果對象的狀態較大,存儲和恢復的成本較高
🚩備忘錄設計模式的Java實現
代碼地址:GitHub
- 創建
Memento(備忘錄) 類
/*** @author hanson* @description: 備忘錄* @date 2025-03-25 22:57:26* @version: 1.0*/
public class Memento {// 備忘錄private String state;public Memento(String state) {this.state = state;}public String getState() {return state;}
}
- 創建
Originator(原發器)
類
/*** @author hanson* @description: 原發器* @date 2025-03-25 22:56:35* @version: 1.0*/
public class Originator {// 原發器private String state;public void setState(String state) {this.state = state;}public String getState() {return state;}public Memento createMemento() {return new Memento(state);}public void setMemento(Memento memento) {state = memento.getState();}
}
- 創建
Caretaker(管理者)
類
/*** @author hanson* @description: 管理者* @date 2025-03-25 22:58:35* @version: 1.0*/
public class Caretaker {// 管理者private List<Memento> mementoList = new ArrayList<>();public void addMemento(Memento state) {mementoList.add(state);}public Memento getMemento(int index) {// 判斷參數是否合法if (index >= 1 && index <= mementoList.size()) {return mementoList.get(index - 1);}return null;}public void showMemento() {int cnt = 1;// for (遍歷對象類型 對象名 : 遍歷對象)for (Memento memento : mementoList) {System.out.println("第" + cnt + "次備份,狀態為:" + memento.getState());cnt++;}}
}
- 測試備忘錄模式
/*** @author hanso* @description: 測試備忘錄模式* @date 2025-03-25 23:00:25* @version: 1.0*/
public class MementoPattern {public static void main(String[] args) {Caretaker caretaker = new Caretaker();Originator originator = new Originator();originator.setState("1024");Memento backup1 = originator.createMemento();caretaker.addMemento(backup1);originator.setState("2048");Memento backup2 = originator.createMemento();caretaker.addMemento(backup2);originator.setState("4096");Memento backup3 = originator.createMemento();caretaker.addMemento(backup3);System.out.println(originator.getState());caretaker.showMemento();Memento memento1 = caretaker.getMemento(2);originator.setMemento(memento1);System.out.println("根據第2次備份還原之后的狀態為:" + originator.getState());}
}
📌 運行結果
🚩代碼總結
-
Originator(原發器):負責創建備忘錄,并存儲和恢復狀態
-
Memento(備忘錄):存儲狀態,不對外暴露內部信息
-
Caretaker(管理者):管理多個備忘錄對象,提供狀態回溯功能
-
支持多次狀態存儲與回溯,可用于撤銷/重做功能
🚩總結
-
備忘錄設計模式 適用于 狀態恢復、撤銷/重做 等場景
-
解耦設計,原發器與管理者獨立,避免外部訪問對象狀態
-
支持歷史記錄管理,但需要注意 內存消耗問題
-
廣泛應用 于 文本編輯器、事務管理、游戲存檔 等
? Java源碼中的應用場景:
-
數據庫事務管理:
-
事務回滾(Rollback)
-
事務日志(Transaction Log)
-
-
Spring 事務管理(TransactionManager):
- 通過事務日志(Transaction Log)來支持回滾
創作不易,不妨點贊、收藏、關注支持一下,各位的支持就是我創作的最大動力??