当前位置: 首页 > news >正文

篇十七:备忘录模式:恢复对象状态

篇十七:"备忘录模式:恢复对象状态"

开始本篇文章之前先推荐一个好用的学习工具,AIRIght,借助于AI助手工具,学习事半功倍。欢迎访问:http://airight.fun/。

另外有2本不错的关于设计模式的资料,分享出来与大家学习参考。
链接:https://pan.baidu.com/s/1RmhQF_o1CdK8U7s5KeILog?pwd=xc6d
提取码:xc6d

设计模式是软件开发中的重要知识,备忘录模式(Memento Pattern)是一种行为型设计模式,用于在不破坏封装性的前提下,捕获对象的内部状态,并在需要时恢复对象到之前的状态。本文将探讨备忘录模式的作用和实现方式,并演示在C++中如何应用备忘录模式来恢复对象状态。

1. 备忘录模式的作用:

备忘录模式是一种用于保存和恢复对象状态的设计模式。在某些情况下,需要在不影响对象封装性的前提下,保存对象的内部状态,并在需要时恢复到之前的状态。备忘录模式可以帮助我们实现这样的需求,从而提供了更好的对象状态管理和撤销操作的能力。

2. 备忘录模式的实现方式:

备忘录模式包含以下核心角色:

  • 原发器(Originator):负责创建备忘录,将其状态保存到备忘录中,并从备忘录中恢复状态。
  • 备忘录(Memento):用于保存原发器的状态。
  • 负责人(Caretaker):负责保存备忘录对象,但不能对备忘录进行修改。

3. 在C++中应用备忘录模式:

以下是备忘录模式的C++示例代码:

a. 定义备忘录类:

// Memento.h
#include <string>class Memento {
public:Memento(const std::string& state) : state_(state) {}std::string getState() const {return state_;}private:std::string state_;
};

b. 定义原发器类:

// Originator.h
#include <iostream>class Originator {
public:Originator(const std::string& initialState) : state_(initialState) {}void setState(const std::string& newState) {std::cout << "Originator: Setting state to " << newState << std::endl;state_ = newState;}Memento createMemento() const {return Memento(state_);}void restoreMemento(const Memento& memento) {state_ = memento.getState();}void printState() const {std::cout << "Originator: Current state is " << state_ << std::endl;}private:std::string state_;
};

c. 定义负责人类:

// Caretaker.h
#include <vector>class Caretaker {
public:void addMemento(const Memento& memento) {mementos_.push_back(memento);}Memento getMemento(int index) const {return mementos_[index];}private:std::vector<Memento> mementos_;
};

d. 客户端使用:

// main.cpp
#include "Originator.h"
#include "Caretaker.h"int main() {Originator originator("State1");Caretaker caretaker;originator.printState();// Save the statecaretaker.addMemento(originator.createMemento());// Change the stateoriginator.setState("State2");originator.printState();// Restore the stateoriginator.restoreMemento(caretaker.getMemento(0));originator.printState();return 0;
}

4. 备忘录模式的代码解析:

在备忘录模式中,原发器负责创建备忘录并保存其状态,负责人负责保存备忘录对象,但不能对备忘录进行修改。备忘录模式通过备忘录对象的保存和恢复实现了对象状态的管理和恢复。

5. 最佳实践:

在使用备忘录模式时,需要注意以下几点:

  • 合理设计备忘录对象:备忘录对象需要保存原发器的状态,但不暴露内部实现细节,从而确保备忘录对象的封装性和安全性。
  • 注意备忘录的资源管理:备忘录对象可能包含大量数据,需要注意合理管理备忘录对象的资源,避免资源泄漏和内存溢出。

6. 总结:

备忘录模式是一种重要的设计模式,它可以用于保存和恢复对象的状态,提供了更好的对象状态管理和撤销操作的能力。在C++中,我们可以通过原发器、备忘录和负责人类来实现备忘录模式。

希望本文能够帮助您理解备忘录模式的作用和实现方式,并通过C++的示例代码演示了如何在C++中应用备忘录模式来恢复对象状态。设计模式是软件开发中的重要知识,掌握不同的设计模式有助于提高代码质量、可维护性和可扩展性。

参考文献:

  • Gamma, E., Helm, R., Johnson, R., & Vlissides, J. (1994). Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley Professional.
  • C++ Core Guidelines: https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines

感谢您的阅读,欢迎一起探讨,共同进步,推荐大家使用学习助手AIRight来解答学习过程中的问题,访问链接:http://airight.fun/

相关文章:

篇十七:备忘录模式:恢复对象状态

篇十七&#xff1a;"备忘录模式&#xff1a;恢复对象状态" 开始本篇文章之前先推荐一个好用的学习工具&#xff0c;AIRIght&#xff0c;借助于AI助手工具&#xff0c;学习事半功倍。欢迎访问&#xff1a;http://airight.fun/。 另外有2本不错的关于设计模式的资料&…...

初识mysql数据库之图形化界面

目录 一、好用的数据库图形化界面软件 1. Navicat 2. SQLyog 3. MYSQL Workbench 二、MYSQL Workbench基本使用 1. 安装 2. 远端连接 3. 执行sql语句 一、好用的数据库图形化界面软件 在以前的文章中&#xff0c;一共介绍了两种使用数据库的方式&#xff0c;分别为在l…...

APP外包开发的H5开发框架

跨平台移动应用开发框架允许开发者使用一套代码在多个操作系统上构建应用程序&#xff0c;从而节省时间和资源。以下是一些常见的跨平台移动应用开发框架以及它们的特点&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0…...

高性能跨平台网络通信框架 HP-Socket v5.9.3

项目主页 : http://www.oschina.net/p/hp-socket开发文档 : https://www.docin.com/p-4478351216.html下载地址 : https://github.com/ldcsaa/HP-SocketQQ Group: 44636872, 663903943 v5.9.3 更新 一、主要更新 问题修复&#xff1a;通过 POST/PUT 等带有请求内容的 HTTP 方…...

Vue3.2+TS在v-for的时候,循环处理时间,将其变成xx-xx-xx xx:xx:xx格式,最后教给大家自己封装一个时间hooks,直接复用

Vue3.2TS在v-for的时候&#xff0c;循环处理时间&#xff0c;将其变成xx-xx-xx xx:xx:xx格式 最后教给大家自己封装一个时间hooks&#xff0c;直接复用 1.没有封装&#xff0c;直接使用 <template><div><ul><li v-for"item,index in arr" :k…...

05 mysql innodb page

前言 最近看到了 何登成 大佬的 "深入MySQL源码 -- Step By Step" 的 pdf 呵呵 似乎是找到了一些 方向 之前对于 mysql 方面的东西, 更多的仅仅是简单的使用[业务中的各种增删改查], 以及一些面试题的背诵 这里会参照 MySQL Internals Manual 来大致的看一下 i…...

记录一次electron打包提示文件找不到的解决方法

没有配置files选项 files的作用是配置打包到应用程序的构建资源 就是说如果你想使用项目那个目录下的文件 就得通过files配置一下不然就会报错 json文件或者yml文件会报的错 格式是这样的 "files": ["dist-electron", "dist"],electron打包配…...

《大型网站技术架构》第二篇 架构-高可用

高可用在公司中的重要性 对公司而言&#xff0c;可用性关系网站的生死存亡。对个人而言&#xff0c;可用性关系到自己的绩效升迁。 工程师对架构做了许多优化、对代码做了很多重构&#xff0c;对性能、扩展性、伸缩性做了很多改善&#xff0c;但别人未必能直观地感受到&#…...

VS Code 使用cnpm下载包失败

一、 问题如下&#xff1a; 网上找到的解决方法是要在powershell中执行&#xff1a; Set-ExecutionPolicy RemoteSigned进行更改策略。 首先我们解释下这个Set-ExecutionPolicy RemoteSigned&#xff0c;Set-ExecutionPolicy 是一个 PowerShell 命令&#xff0c;用于控制脚本…...

【图像分类】CNN + Transformer 结合系列.4

介绍两篇利用Transformer做图像分类的论文&#xff1a;CoAtNet&#xff08;NeurIPS2021&#xff09;&#xff0c;ConvMixer&#xff08;ICLR2022&#xff09;。CoAtNet结合CNN和Transformer的优点进行改进&#xff0c;ConvMixer则patch的角度来说明划分patch有助于分类。 CoAtN…...

分享一下利用Vue表单处理实现复杂表单布局

在开发Web应用程序中&#xff0c;表单是非常常见的一种元素。而在某些情况下&#xff0c;我们需要实现一些更为复杂的表单布局&#xff0c;以满足业务需求。使用Vue.js作为前端框架&#xff0c;我们可以很方便地处理复杂表单布局&#xff0c;并且实现数据的双向绑定。 下面来将…...

SAP Fiori 问题收集

事务代码篇 启动工作台&#xff1a;/N/UI2/FLP 错误日志&#xff1a; /n/IWFND/ERROR_LOG 服务清单&#xff1a; /n/IWFND/MAINT_SERVICE 创建语义对象&#xff1a;/N/UI2/SEMOBJ 创建目录&#xff1a;/N/UI2/FLPD_CONF&#xff08;cross-client&#xff09;或 /N/UI2…...

econml双机器学习实现连续干预和预测

连续干预 在这个示例中&#xff0c;我们使用LinearDML模型&#xff0c;使用随机森林回归模型来估计因果效应。我们首先模拟数据&#xff0c;然后模型&#xff0c;并使用方法来effect创建不同干预值下的效应&#xff08;Conditional Average Treatment Effect&#xff0c;CATE&…...

《甲午》观后感——GPT-3.5所写

《甲午》是一部令人深思的纪录片&#xff0c;通过生动的画面和真实的故事&#xff0c;向观众展示了中国历史上的一段重要时期。观看这部纪录片&#xff0c;我深受触动&#xff0c;对历史的认识也得到了深化。 首先&#xff0c;这部纪录片通过精心搜集的历史资料和珍贵的影像资料…...

Java技术整理(6)—— 微服务篇

1、服务注册发现 服务注册就是维护一个服务列表&#xff0c;它在管理系统内所有的服务地址&#xff0c;当新的服务启动后&#xff0c;它会向服务列表提交自己的服务地址&#xff0c;服务的调用法可以直接向服务列表发送服务列表获取请求&#xff0c;就能获得所有的服务地址&am…...

途乐证券-新股行情持续火爆,哪些因素影响首日表现?

全面注册制以来&#xff0c;参加打新的投资者数量全体呈现下降。打新收益下降&#xff0c;破发频出的布景下&#xff0c;投资者打新策略从逢新必打逐步向优选个股改变。 经过很多历史数据&#xff0c;从商场定价、参加者热度以及机构重视度维度揭秘了上市后股价体现优秀的个股具…...

在生产环境中部署Elasticsearch:最佳实践和故障排除技巧——聚合与搜索(三)

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…...

基于weka手工实现KNN

一、KNN模型 K最近邻&#xff08;K-Nearest Neighbors&#xff0c;简称KNN&#xff09;算法是一种常用的基于实例的监督学习算法。它可以用于分类和回归问题&#xff0c;并且是一种非常直观和简单的机器学习算法。 KNN算法的基本思想是&#xff1a;对于一个新的样本数据&…...

Lua 闭包

一、Lua 中的函数 Lua 中的函数是第一类值。意味着和其他的常见类型的值&#xff08;例如数值和字符串&#xff09;具有同等权限。 举个例子&#xff0c;函数也可以像其他类型一样存储起来&#xff0c;然后调用 -- 将 a.p 指向 print 函数 a { p print } -- 使用 a.p 函数…...

Java技术整理(1)—— JVM篇

1、什么是JVM&#xff1f; JVM是一个可运行Java代码的虚拟计算机&#xff0c;包括一套字节码指令集&#xff0c;一组寄存器&#xff0c;一个栈&#xff0c;一个垃圾回收&#xff0c;堆和一个存储方式栈。JVM 是运行在操作系统之上&#xff0c;并不与操作系统直接交互。 2、运行…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

视觉slam十四讲实践部分记录——ch2、ch3

ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

Linux 中如何提取压缩文件 ?

Linux 是一种流行的开源操作系统&#xff0c;它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间&#xff0c;使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的&#xff0c;要在 …...

GitHub 趋势日报 (2025年06月06日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...

Qemu arm操作系统开发环境

使用qemu虚拟arm硬件比较合适。 步骤如下&#xff1a; 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载&#xff0c;下载地址&#xff1a;https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...

Java后端检查空条件查询

通过抛出运行异常&#xff1a;throw new RuntimeException("请输入查询条件&#xff01;");BranchWarehouseServiceImpl.java // 查询试剂交易&#xff08;入库/出库&#xff09;记录Overridepublic List<BranchWarehouseTransactions> queryForReagent(Branch…...

2025年- H71-Lc179--39.组合总和(回溯,组合)--Java版

1.题目描述 2.思路 当前的元素可以重复使用。 &#xff08;1&#xff09;确定回溯算法函数的参数和返回值&#xff08;一般是void类型&#xff09; &#xff08;2&#xff09;因为是用递归实现的&#xff0c;所以我们要确定终止条件 &#xff08;3&#xff09;单层搜索逻辑 二…...

Vue 实例的数据对象详解

Vue 实例的数据对象详解 在 Vue 中,数据对象是响应式系统的核心,也是组件状态的载体。理解数据对象的原理和使用方式是成为 Vue 专家的关键一步。我将从多个维度深入剖析 Vue 实例的数据对象。 一、数据对象的定义方式 1. Options API 中的定义 在 Options API 中,使用 …...

IP选择注意事项

IP选择注意事项 MTP、FTP、EFUSE、EMEMORY选择时&#xff0c;需要考虑以下参数&#xff0c;然后确定后选择IP。 容量工作电压范围温度范围擦除、烧写速度/耗时读取所有bit的时间待机功耗擦写、烧写功耗面积所需要的mask layer...