目錄
- 一、 啥是備忘錄模式?
- 二、 為什么要用備忘錄模式?
- 三、 備忘錄模式的實現方式
- 四、 備忘錄模式的優缺點
- 五、 備忘錄模式的應用場景
- 六、 總結
🌟我的其他文章也講解的比較有趣😁,如果喜歡博主的講解方式,可以多多支持一下,感謝🤗!
🌟了解訪問者模式請看: (二 十 一)趣學設計模式 之 訪問者模式!
?更多請看個人主頁: 碼熔burning
這篇文章帶你詳細認識一下設計模式中的備忘錄模式
一、 啥是備忘錄模式?
想象一下,你在玩一個游戲 🎮,你打到了一個很高的分數,但是你怕后面會失誤,導致分數降低 📉。 這時候,你可以保存一個游戲存檔 💾,這樣即使你后面失誤了,也可以讀檔回到之前的狀態 🕹?。
備忘錄模式,就是在不破壞封裝性的前提下,捕獲一個對象的內部狀態,并在該對象之外保存這個狀態。這樣以后就可將該對象恢復到保存的狀態! 簡單來說,就是給對象做一個“快照”,方便以后恢復 📸。
簡單來說,就是給對象創建一個“存檔點”,以便在需要的時候可以“讀檔重來”! 💾+🕹?
- 你需要保存一個對象的內部狀態,以便以后可以恢復: 就像你需要保存游戲存檔,以便在失誤后可以讀檔 🎮!
- 你不想破壞對象的封裝性: 就像你不想直接訪問游戲內部的數據,而是通過存檔來保存狀態 💾!
- 你需要支持撤銷操作: 就像你需要支持游戲中的“悔棋”功能 🔙!
二、 為什么要用備忘錄模式?
用備忘錄模式,好處多多 👍:
- 保存狀態: 可以保存對象的內部狀態,方便以后恢復 💾!
- 保護封裝性: 不破壞對象的封裝性 🔒!
- 支持撤銷: 可以支持撤銷操作 🔙!
- 簡化對象: 可以將復雜的對象狀態存儲到備忘錄中,簡化對象本身 🧘!
三、 備忘錄模式的實現方式
備忘錄模式主要包含以下幾個角色:
- 發起人(Originator): 創建備忘錄,并使用備忘錄恢復自身狀態 🕹?。
- 備忘錄(Memento): 存儲發起人的內部狀態 💾。
- 管理者(Caretaker): 負責保存備忘錄,但不檢查備忘錄的內容 📦。
代碼示例:
// 備忘錄:游戲存檔
class GameMemento {private int score; // 分數private int level; // 關卡public GameMemento(int score, int level) {this.score = score;this.level = level;}public int getScore() {return score;}public int getLevel() {return level;}
}// 發起人:游戲角色
class GameRole {private int score; // 分數private int level; // 關卡public GameRole(int score, int level) {this.score = score;this.level = level;}public int getScore() {return score;}public void setScore(int score) {this.score = score;}public int getLevel() {return level;}public void setLevel(int level) {this.level = level;}// 創建備忘錄public GameMemento createMemento() {return new GameMemento(score, level);}// 從備忘錄恢復狀態public void restoreMemento(GameMemento memento) {this.score = memento.getScore();this.level = memento.getLevel();}// 顯示游戲狀態public void display() {System.out.println("當前分數:" + score + ",當前關卡:" + level);}
}// 管理者:存檔管理器
class Caretaker {private GameMemento memento; // 備忘錄public GameMemento getMemento() {return memento;}public void setMemento(GameMemento memento) {this.memento = memento;}
}// 客戶端
public class Client {public static void main(String[] args) {GameRole gameRole = new GameRole(1000, 5); // 創建游戲角色gameRole.display(); // 顯示游戲狀態Caretaker caretaker = new Caretaker(); // 創建存檔管理器caretaker.setMemento(gameRole.createMemento()); // 保存游戲存檔gameRole.setScore(500); // 游戲失誤,分數降低gameRole.setLevel(3); // 關卡降低gameRole.display(); // 顯示游戲狀態gameRole.restoreMemento(caretaker.getMemento()); // 讀檔gameRole.display(); // 顯示游戲狀態}
}
分析:
GameMemento
是備忘錄,存儲了游戲角色的分數和關卡。GameRole
是發起人,可以創建備忘錄,并使用備忘錄恢復自身狀態。Caretaker
是管理者,負責保存備忘錄。
輸出結果:
當前分數:1000,當前關卡:5
當前分數:500,當前關卡:3
當前分數:1000,當前關卡:5
四、 備忘錄模式的優缺點
優點:
- 保存狀態 💾!
- 保護封裝性 🔒!
- 支持撤銷 🔙!
- 簡化對象 🧘!
缺點:
- 增加了存儲成本(需要存儲備忘錄) 💰!
- 管理備忘錄可能會比較復雜 📦!
五、 備忘錄模式的應用場景
- 需要保存一個對象的內部狀態,以便以后可以恢復: 就像你需要保存游戲存檔,以便在失誤后可以讀檔 🎮!
- 需要支持撤銷操作: 就像你需要支持游戲中的“悔棋”功能 🔙!
- 需要在事務管理中實現回滾操作: 就像數據庫事務需要支持回滾操作 🔄!
- 需要在編輯器中實現撤銷/重做功能: 就像 Word 編輯器需要支持撤銷/重做功能 📝!
六、 總結
- 備忘錄模式就像給對象創建一個“存檔點”,以便在需要的時候可以“讀檔重來”! 💾+🕹?
- 優點是保存狀態、保護封裝性、支持撤銷、簡化對象! 👍
- 缺點是增加存儲成本、管理備忘錄復雜! 👎
- 適用于需要保存對象狀態,并支持撤銷操作的場景! 🎯
希望這篇文章能讓你徹底理解備忘錄模式! 💯 祝你學習愉快! 😄
看完請看:(二 十 三)趣學設計模式 之 解釋器模式!