(二 十 二)趣學設計模式 之 備忘錄模式!

在這里插入圖片描述

目錄

    • 一、 啥是備忘錄模式?
    • 二、 為什么要用備忘錄模式?
    • 三、 備忘錄模式的實現方式
    • 四、 備忘錄模式的優缺點
    • 五、 備忘錄模式的應用場景
    • 六、 總結

🌟我的其他文章也講解的比較有趣😁,如果喜歡博主的講解方式,可以多多支持一下,感謝🤗!
🌟了解訪問者模式請看: (二 十 一)趣學設計模式 之 訪問者模式!
?更多請看個人主頁: 碼熔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 編輯器需要支持撤銷/重做功能 📝!

六、 總結

  • 備忘錄模式就像給對象創建一個“存檔點”,以便在需要的時候可以“讀檔重來”! 💾+🕹?
  • 優點是保存狀態、保護封裝性、支持撤銷、簡化對象! 👍
  • 缺點是增加存儲成本、管理備忘錄復雜! 👎
  • 適用于需要保存對象狀態,并支持撤銷操作的場景! 🎯

希望這篇文章能讓你徹底理解備忘錄模式! 💯 祝你學習愉快! 😄
看完請看:(二 十 三)趣學設計模式 之 解釋器模式!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/897344.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/897344.shtml
英文地址,請注明出處:http://en.pswp.cn/news/897344.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

安裝SPSS后啟動顯示應用程序無法啟動,因為應用程序的并行配置不正確的解決方案

軟件安裝報錯問題有需要遠程文章末尾獲取聯系方式,可以幫你遠程處理各類安裝報錯。 一、安裝SPSS后啟動顯示應用程序無法啟動,因為應用程序的并行配置不正確報錯 在成功安裝 SPSS 軟件后,嘗試啟動應用程序時,系統彈出錯誤提示窗…

IP,MAC,ARP 筆記

1.什么是IP地址 IP 地址是一串由句點分隔的數字。IP 地址表示為一組四個數字,比如 192.158.1.38 就是一個例子。該組合中的每個數字都可以在 0 到 255 的范圍內。因此,完整的 IP 尋址范圍從 0.0.0.0 到 255.255.255.255。 IP 地址不是隨機的。它們由互…

C++11中的Condition_variable

C11中的condition_variable 在C11中,條件變量(std::condition_variable)是線程同步機制之一,用于在多線程環境中實現線程間的通信和協調。它允許一個或多個線程在某個條件尚未滿足時等待,直到其他線程通知條件已經滿足…

IO多路復用實現并發服務器

一.select函數 select 的調用注意事項 在使用 select 函數時,需要注意以下幾個關鍵點: 1. 參數的修改與拷貝 readfds 等參數是結果參數 : select 函數會直接修改傳入的 fd_set(如 readfds、writefds 和 exceptfds&#xf…

_二級繼電器程控放大倍數自動設置

簡介 在開發項目中,有時會遇到需要使用程控放大的情況,如果沒有opa那種可編程放大器,那么就需要通過繼電器來控制放大倍數。而在繼電器程控中,常用的是二級程控,三級程控相較于二級就復雜了許多。 在二級程控中&#x…

電腦總顯示串口正在被占用處理方法

1.現象 在嵌入式開發過程中,有很多情況下要使用串口調試,其中485/422/232轉usb串口是非常常見的做法。 根據協議,接口芯片不同,需要安裝對應的驅動程序,比如ch340,cp2102,CDM212364等驅動。可…

優雅拼接字符串:StringJoiner 的完整指南

在Java開發中,字符串拼接是高頻操作。無論是日志格式化、構建CSV數據,還是生成動態SQL,開發者常需處理分隔符、前綴和后綴的組合。傳統的StringBuilder雖然靈活,但代碼冗余且易出錯。Java 8推出的StringJoiner類,以簡潔…

LabVIEW閉環控制系統硬件選型與實時性能

在LabVIEW閉環控制系統的開發中,硬件選型直接影響系統的實時性、精度與穩定性。需綜合考慮數據采集速度(采樣率、接口帶寬)、計算延遲(算法復雜度、處理器性能)、輸出響應時間(執行器延遲、控制周期&#x…

Hive的架構

1. 概念 Hive 是建立在 Hadoop 上的數據倉庫工具,旨在簡化大規模數據集的查詢與管理。它通過類 SQL 語言(HiveQL)將結構化數據映射為 Hadoop 的 MapReduce,適合離線批處理,尤其適用于數據倉庫場景。 2. 數據模型 表&a…

深入解析:Linux中KVM虛擬化技術

這篇文章將深入分析Linux中虛擬化技術的實現----KVM技術,從KVM技術的簡介、技術架構、以及虛擬機和宿主機交互的重要處理邏輯出發,深入探究KVM技術的實現。 一、KVM簡介: 首先,我們先查看一下KVM架構,看看它的整體工…

golang學習筆記——go語言安裝及系統環境變量設置

文章目錄 go語言安裝go envgo getgoproxy測試安裝 Go 插件安裝 Go 插件依賴工具參考資料用戶環境變量和系統環境變量用戶環境變量系統環境變量示例設置環境變量的步驟設置用戶環境變量設置系統環境變量 驗證環境變量總結 2024年最火的5大Go框架1. Gin:高并發接口的“…

3.6c語言

#define _CRT_SECURE_NO_WARNINGS #include <math.h> #include <stdio.h> int main() {int sum 0,i,j;for (j 1; j < 1000; j){sum 0;for (i 1; i < j; i){if (j % i 0){sum i;} }if (sum j){printf("%d是完數\n", j);}}return 0; }#de…

【TI】如何更改 CCS20.1.0 的 WORKSPACE 默認路徑

參考鏈接&#xff1a; 如何更改 CCS Theia 中工作區的默認位置&#xff1f;- Code Composer Studio 論壇 - Code Composer Studio?? - TI E2E 支持論壇 --- How to change the default location for the workspace in CCS Theia? - Code Composer Studio forum - Code Comp…

Vue3中動態Ref的魔法:綁定與妙用

前言 在Vue 3的開發過程中,動態綁定Ref是一項非常實用的技術,特別是在處理復雜組件結構和動態數據時。通過動態綁定Ref,我們可以更靈活地訪問和操作DOM元素或組件實例,實現更高效的交互和狀態管理。本文將詳細介紹如何在Vue 3中實現動態Ref的綁定,并通過實例展示其妙用。…

CarPlanner:用于自動駕駛大規模強化學習的一致性自回歸軌跡規劃

25年2月來自浙大和菜鳥網絡的論文“CarPlanner: Consistent Auto-regressive Trajectory Planning for Large-scale Reinforcement Learning in Autonomous Driving”。 軌跡規劃對于自動駕駛至關重要&#xff0c;可確保在復雜環境中安全高效地導航。雖然最近基于學習的方法&a…

VS Code連接服務器教程

VS Code是什么 VS Code&#xff08;全稱 Visual Studio Code&#xff09;是一款由微軟推出的免費、開源、跨平臺的代碼編輯神器。VS Code 支持 所有主流操作系統&#xff0c;擁有強大的功能和靈活的擴展性。 官網&#xff1a;https://code.visualstudio.com/插件市場&#xff1…

【JavaWeb】Web基礎概念

文章目錄 1、服務器與客戶端2、服務器端應用程序3、請求和響應4、項目的邏輯構成5、架構5.1 概念5.2 發展演變歷程單一架構分布式架構 5.3 單一架構技術體系 6、本階段技術體系 1、服務器與客戶端 ①線下的服務器與客戶端 ②線上的服務器與客戶端 2、服務器端應用程序 我…

安徽省考計算機專業科目2025(持續更新)

目錄 第一部分 計算機科學技術基礎 第一章 計算機及其應用基礎知識 1.1 計算機的特點、分類及其應用 1.2 信息編碼與數據表示&#xff1b;數制及其轉換方法&#xff1b;算術運算和邏輯運算的過程 第一部分 計算機科學技術基礎 第一章 計算機及其應用基礎知識 1.1 計算機…

前端知識點---路由模式-實例模式和單例模式(ts)

在 ArkTS&#xff08;Ark UI 框架&#xff09;中&#xff0c;路由實例模式&#xff08;Standard Instance Mode&#xff09;主要用于管理頁面跳轉。當創建一個新頁面時&#xff0c;可以選擇標準實例模式&#xff08;Standard Mode&#xff09;或單實例模式&#xff08;Single M…

【leetcode hot 100 73】矩陣置零

解法一&#xff1a;&#xff08;使用兩個標記變量&#xff09;用矩陣的第一行和第一列代替方法一中的兩個標記數組&#xff08;col、row[ ]&#xff1a;第幾列、行出現0&#xff09;&#xff0c;以達到 O(1) 的額外空間。 這樣會導致原數組的第一行和第一列被修改&#xff0c;…