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.mzph.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;但速度较慢