23種設計模式 - 備忘錄模式

模式定義

備忘錄模式(Memento Pattern)是一種行為型設計模式,其核心是在不破壞對象封裝性的前提下,捕獲并保存對象的內部狀態,以便后續恢復。該模式特別適用于需要實現撤銷/重做、狀態回滾等功能的系統,如數控系統的加工狀態保存與恢復。


模式結構

發起人(Originator)

  • 負責創建備忘錄(保存當前狀態)和從備忘錄恢復狀態。
    備忘錄(Memento)
  • 存儲發起人的內部狀態,僅允許發起人訪問其數據。
    管理者(Caretaker)
  • 保存和管理備忘錄,但不修改其內容。

適用場景

數控系統狀態保存:如加工參數(坐標、速度)的備份與恢復。
操作撤銷/重做:用戶誤操作后回滾到歷史狀態。
系統故障恢復:異常停機時恢復至安全狀態。


C++示例(數控系統場景)

場景說明:
數控機床在加工過程中需要保存當前狀態(坐標、速度),當發生異常時恢復至最近一次保存的狀態。

#include 
#include 
#include // 備忘錄:保存數控系統狀態
class CNCStateMemento {
private:std::string position_;  // 坐標double speed_;          // 速度
public:CNCStateMemento(std::string pos, double speed) : position_(pos), speed_(speed) {}// 僅允許Originator訪問(友元類)friend class CNCMachine;
};// 發起人:數控機床
class CNCMachine {
private:std::string position_;double speed_;
public:void setState(std::string pos, double speed) {position_ = pos;speed_ = speed;}CNCStateMemento* saveState() {return new CNCStateMemento(position_, speed_);}void restoreState(CNCStateMemento* memento) {position_ = memento->position_;speed_ = memento->speed_;std::cout << "恢復至狀態:坐標=" << position_ << ",速度=" << speed_ << std::endl;}void display() const {std::cout << "當前狀態:坐標=" << position_ << ",速度=" << speed_ << std::endl;}
};// 管理者:狀態歷史記錄
class CNCCaretaker {
private:std::vector history_;
public:void addMemento(CNCStateMemento* memento) {history_.push_back(memento);}CNCStateMemento* getLastMemento() {if (history_.empty()) return nullptr;CNCStateMemento* last = history_.back();history_.pop_back();return last;}
};// 客戶端使用示例
int main() {CNCMachine machine;CNCCaretaker caretaker;// 設置初始狀態并保存machine.setState("X100 Y200", 1500);caretaker.addMemento(machine.saveState());machine.display();  // 輸出當前狀態// 修改狀態(模擬異常操作)machine.setState("X150 Y250", 2000);std::cout << "異常操作后:";machine.display();// 恢復至最近保存的狀態CNStateMemento* lastState = caretaker.getLastMemento();if (lastState) {machine.restoreState(lastState);machine.display();}return 0;
}

代碼解析
CNCStateMemento:封裝數控機床的坐標和速度,僅允許CNCMachine訪問(通過友元類)。
CNCMachine:作為發起人,提供saveState()restoreState()方法實現狀態保存與恢復。
CNCCaretaker:管理歷史狀態,支持撤銷操作。


優勢與局限

優勢:

  • 狀態封裝性良好,避免外部直接訪問。
  • 簡化數控系統的狀態管理邏輯。
    局限:
  • 頻繁保存狀態可能導致內存占用高。

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

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

相關文章

2025asp.net全棧技術開發學習路線圖

2025年技術亮點?&#xff1a; Blazor已全面支持WebAssembly 2.0標準 .NET 8版本原生集成AI模型部署能力 Azure Kubernetes服務實現智能自動擴縮容 EF Core新增向量數據庫支持特性 ?ASP.NET 全棧開發關鍵技術說明&#xff08;2025年視角&#xff09;? 以下技術分類基于現…

Linux設備驅動-練習

練習要求&#xff1a; 一、設備樹 1、配置設備樹信息&#xff1a;將3個led燈和1個風扇使用到的設備信息配置到設備樹中 二、設備驅動層 1、通過of_find_node_by_name、of_get_named_gpion等內核核心層統一的api接口調用外設&#xff1b; 2、通過udev設備管理器自動注冊并創建設…

Python應用算法之貪心算法理解和實踐

一、什么是貪心算法&#xff1f; 貪心算法&#xff08;Greedy Algorithm&#xff09;是一種簡單而高效的算法設計思想&#xff0c;其核心思想是&#xff1a;在每一步選擇中&#xff0c;都采取當前狀態下最優的選擇&#xff08;即“局部最優解”&#xff09;&#xff0c;希望通…

競爭與冒險問題【數電速通】

時序邏輯電路&#xff1a; 組合邏輯電路中的競爭與冒險問題&#xff1a; 在組合邏輯電路中&#xff0c;競爭和冒險是兩種常見的時序問題&#xff0c;它們通常由電路的延時特性和不完美的設計引起。下面是這兩種現象的詳細解釋&#xff1a; 1. 競爭&#xff08;Race Condition&…

nasm - BasicWindow_64

文章目錄 nasm - BasicWindow_64概述筆記nasm_main.asmmy_build.batEND nasm - BasicWindow_64 概述 學個demo, 這個demo最主要學到了: 不用在調用每個API前都準備陰影區&#xff0c;在API調用后棧平衡。 可以在函數入口處考慮到所用的棧尺寸最大值(16字節對齊&#xff0c;陰…

JavaScript變量的作用域介紹

JavaScript變量的作用域介紹 JavaScript 變量的作用域決定了變量在代碼中的可訪問性。 var 是 JavaScript 中最早用于聲明變量的關鍵字&#xff0c;它函數作用域或全局作用域。 let 關鍵字&#xff0c;具有塊級作用域、全局作用域。 const關鍵字&#xff0c;具有塊級作用域…

Microsoft 365 Copilot中使用人數最多的是哪些應用

今天在瀏覽Microsoft 365 admin center時發現&#xff0c;copilot會自動整理過去30天內所有用戶使用copilot的概況&#xff1a; 直接把這個圖丟給copilot讓它去分析&#xff0c;結果如下&#xff1a; 總用戶情況 總用戶數在各應用中均為 561 人&#xff0c;說明此次統計的樣本…

ue5.2.1 quixel brideg顯示asset not available in uAsset format

我從未見過如此傻x的bug&#xff0c;在ue5.2.1上通過內置quixel下載資源顯示 asset not available in uAsset format 解決辦法&#xff1a;將ue更新到最新版本&#xff0c;通過fab進入商場選擇資源后add to my library 點擊view in launcher打開epic launcher&#xff0c;就可…

當電腦上有幾個python版本Vscode選擇特定版本python

查看當前vscode用的python版本命令 Import sys print(sys.version) 修改VSCODE解釋器 打開 VSCode。 按下 CtrlShiftP打開命令面板。 輸入 Python: Select Interpreter 并選擇它。 從彈出的列表中選擇你安裝的 Python 解釋器。如果你有多個 Python 版本&#xff08;例如…

Vue 中 nextTick 的原理詳解

1. 為什么需要 nextTick Vue 采用 異步渲染機制&#xff0c;當響應式數據發生變化時&#xff0c;Vue 并不會立即更新 DOM&#xff0c;而是將這些變化放入一個 隊列 中&#xff0c;并在 同一事件循環&#xff08;Event Loop&#xff09;中合并相同的修改&#xff0c;最后執行批…

Spring面試題2

1、compareable和compactor區別 定義與包位置:Comparable是一個接口&#xff0c;位于java.lang包,需要類去實現接口&#xff1b;而Compactor是一個外部比較器&#xff0c;位于java.util包 用法&#xff1a;Comparable只需要實現int compareTo(T o) 方法&#xff0c;比較當前對…

DuodooBMS源碼解讀之 cncw_statement模塊

財務應收應付擴展模組用戶使用手冊 一、模塊概述 財務應收應付擴展模組是一個基于 Odoo18 的擴展模塊&#xff0c;主要對財務應收應付相關功能進行了修改和增強。該模塊增加了多個功能模塊&#xff0c;如預收款單模塊、費用類別設置模塊等&#xff0c;同時對發票、公司、銷售…

JUC并發—9.并發安全集合四

大綱 1.并發安全的數組列表CopyOnWriteArrayList 2.并發安全的鏈表隊列ConcurrentLinkedQueue 3.并發編程中的阻塞隊列概述 4.JUC的各種阻塞隊列介紹 5.LinkedBlockingQueue的具體實現原理 6.基于兩個隊列實現的集群同步機制 4.JUC的各種阻塞隊列介紹 (1)基于數組的阻塞…

vue項目啟動時報錯:error:0308010C:digital envelope routines::unsupported

此錯誤與 Node.js 的加密模塊有關&#xff0c;特別是在使用 OpenSSL 3.0 及以上版本時。Vue 項目在啟動時可能會依賴一些舊的加密算法&#xff0c;而這些算法在 OpenSSL 3.0 中默認被禁用&#xff0c;導致 error:0308010C:digital envelope routines::unsupported 錯誤。 解決…

ncDLRES:一種基于動態LSTM和ResNet的非編碼RNA家族預測新方法

現有的計算方法主要分為兩類&#xff1a;第一類是通過學習序列或二級結構的特征來預測ncRNAs家族&#xff0c;另一類是通過同源序列之間的比對來預測ncRNAs家族。在第一類中&#xff0c;一些方法通過學習預測的二級結構特征來預測ncRNAs家族。二級結構預測的不準確性可能會導致…

愛普生 SG-8101CE 可編程晶振在筆記本電腦的應用

在筆記本電腦的精密架構中&#xff0c;每一個微小的元件都如同精密儀器中的齒輪&#xff0c;雖小卻對整體性能起著關鍵作用。如今的筆記本電腦早已不再局限于簡單的辦公用途&#xff0c;其功能愈發豐富多樣。從日常輕松的文字處理、網頁瀏覽&#xff0c;到專業領域中對圖形處理…

SPRING10_getBean源碼詳細解讀、流程圖

文章目錄 ①. getBean方法的入口-DefaultListableBeanFactory②. DefaultListableBeanFactory調用getBean③. 進入到doGetBean方法④. getSingleton三級緩存方法⑤. getSingleton()方法分析⑥. createBean創建對象方法⑦. 對象創建、屬性賦值、初始化⑧. getBean最詳細流程圖 ①…

IDEA中查詢Maven項目的依賴樹

在Maven項目中&#xff0c;查看項目的依賴樹是一個常見的需求&#xff0c;特別是當你需要了解項目中直接或間接依賴了哪些庫及其版本時。你可以通過命令行使用Maven的dependency:tree插件來做到這一點。這個命令會列出項目中所有依賴的樹狀結構。 打開idea項目的終端&#xff…

深入xtquant:財務數據獲取與應用的實戰指南

深入xtquant&#xff1a;財務數據獲取與應用的實戰指南 在量化交易領域&#xff0c;雖然技術分析和市場情緒分析占據了主導地位&#xff0c;但財務數據作為評估公司基本面的重要依據&#xff0c;同樣不可或缺。xtquant作為一個強大的Python庫&#xff0c;提供了便捷的接口來獲…

windows 安裝 stable diffusion

在windows上安裝 stable diffusion&#xff0c;如果windows沒有nvidia顯卡&#xff0c;想只使用CPU可在webui-user.bat中添加命令 set COMMANDLINE_ARGS--no-half --skip-torch-cuda-test 可正常使用stable diffusion&#xff0c;但速度較慢