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