23种设计模式 - 备忘录模式

server/2025/2/22 14:34:14/

模式定义

备忘录模式(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.ppmy.cn/server/169862.html

相关文章

iOS 中的圆角与平滑圆角:从新特性到老项目适配

引言 在 iOS 开发中&#xff0c;圆角是非常常见的 UI 元素&#xff0c;它能够让按钮、卡片和输入框等界面元素更加柔和、现代。传统的圆角效果通过 cornerRadius 属性实现&#xff0c;但在一些设计中&#xff0c;圆角的过渡并不够自然&#xff0c;尤其是在高分辨率屏幕上&…

CSS Grid 布局学习笔记

1. 概述 CSS Grid 布局是一个强大的二维布局系统&#xff0c;它可以在网页上创建复杂的布局。Grid 布局允许你在水平和垂直方向上设计网页布局。 2. 基本概念 2.1 网格容器&#xff08;Grid Container&#xff09; 使用 display: grid; 或 display: inline-grid; 将一个元素…

MATLAB在数据分析和绘图中的应用:从基础到实践

引言 股票数据分析是金融领域中的重要研究方向&#xff0c;通过对历史价格、成交量等数据的分析&#xff0c;可以帮助投资者更好地理解市场趋势和做出决策。MATLAB作为一种强大的科学计算工具&#xff0c;提供了丰富的数据处理和可视化功能&#xff0c;非常适合用于股票数据的…

一周学会Flask3 Python Web开发-客户端状态信息Cookie以及加密

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili HTTP是无状态&#xff08;stateless)协议。也就是说&#xff0c;在一次请求响应结束后&#xff0c;服务器不会留下任何关于对…

【Linux】命名管道------Linux进程间通信的桥梁

目录 一、什么是命名管道&#xff1a; 二、在代码中的命名管道&#xff1a; 三、打印日志&#xff1a; 1、封装管理管道&#xff1a; 2、日志文件的建立&#xff1a; 日志时间&#xff1a; 日志级别&#xff1a; 日志打印方式&#xff1a; 日志类构造与析构&#xff1…

游戏引擎学习第115天

仓库:https://gitee.com/mrxiao_com/2d_game_3 打开程序&#xff0c;查看我们在性能方面的进展 这段内容主要介绍了优化代码以利用处理器中的SIMD&#xff08;单指令多数据&#xff09;向量单元的基本概念。具体流程如下&#xff1a; 讲解了SIMD的基本原理&#xff0c;如何通…

视频HDR技术详解,你的电脑怎么播放HDR视频?

闲聊&#xff1a;前两天在b站上面看到影视飓风的视频&#xff0c;让我有点疑惑&#xff0c;我不知道为什么播放视频有设备撑不住一说&#xff0c;所以感兴趣去ytb下载了4k原片30hz刷新的&#xff0c;然后测试一下我的电脑能不能播放&#xff0c;发现还是可以的&#xff0c;视觉…

基于Spring Boot的农事管理系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…