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

备忘录模式(Memento Pattern)

定义

备忘录模式(Memento Pattern)是一种行为设计模式,它允许在不破坏封装性的前提下捕获一个对象的内部状态,并在以后将对象恢复到该状态。备忘录模式通常用于实现撤销操作(Undo)或历史记录(History)等功能。

在备忘录模式中,我们定义三个角色:

  1. Originator:记录当前时刻它的内部状态,并可使用备忘录对象恢复到之前的状态。
  2. Memento:负责存储Originator对象的内部状态,并可防止Originator以外的对象访问备忘录。
  3. Caretaker:负责保存好备忘录对象,不能对备忘录的内容进行操作或检查。

示例

下面是一个C++的备忘录模式示例:

#include <iostream>  
#include <string>  
#include <vector>  // Memento类,存储Originator的内部状态  
class Memento {  
public:  std::string state; // 假设Originator有一个string类型的状态  // 构造函数,用于从Originator获取状态  Memento(const std::string& state) : state(state) {}  
};  // Originator类,负责创建Memento,并可以使用Memento恢复状态  
class Originator {  
private:  std::string state; // Originator的内部状态  public:  // 获取当前状态  std::string getState() const {  return state;  }  // 设置状态  void setState(const std::string& newState) {  state = newState;  std::cout << "Originator state changed to: " << state << std::endl;  }  // 创建Memento对象,保存当前状态  Memento* createMemento() {  return new Memento(state);  }  // 使用Memento恢复状态  void restoreMemento(const Memento* memento) {  state = memento->state;  std::cout << "Originator state restored to: " << state << std::endl;  }  
};  // Caretaker类,负责保存Memento对象  
class Caretaker {  
private:  std::vector<Memento*> mementos; // 存储Memento对象的容器  public:  // 添加Memento到容器中  void addMemento(Memento* memento) {  mementos.push_back(memento);  }  // 获取Memento对象,用于恢复状态  Memento* getMemento(int index) {  if (index >= 0 && index < mementos.size()) {  return mementos[index];  }  return nullptr;  }  
};  int main() {  Originator* originator = new Originator();  Caretaker* caretaker = new Caretaker();  // 设置Originator的初始状态  originator->setState("Initial State");  // 保存当前状态到Caretaker  caretaker->addMemento(originator->createMemento());  // 修改Originator的状态  originator->setState("Modified State");  // 使用Caretaker中的Memento恢复Originator的状态  originator->restoreMemento(caretaker->getMemento(0));  // 清理资源  delete originator;  delete caretaker;  return 0;  
}

在这个示例中:

  • Memento 类存储了 Originator 的内部状态,即一个字符串 state
  • Originator 类有一个私有成员 state,并提供了 setState 和 getState 方法来修改和获取这个状态。它还提供了 createMemento 方法来创建一个包含当前状态的 Memento 对象,以及 restoreMemento 方法来根据 Memento 对象恢复状态。
  • Caretaker 类负责保存 Memento 对象,并提供 addMemento 和 getMemento 方法来添加和获取 Memento 对象。

在 main 函数中,我们创建了一个 Originator 对象和一个 Caretaker 对象。我们首先设置了 Originator 的初始状态,并将这个状态保存到 Caretaker 中。然后我们修改了 Originator 的状态,并使用 Caretaker 中保存的 Memento 对象来恢复 Originator 的状态。

这个示例展示了如何使用备忘录模式来保存和恢复对象的状态。在实际应用中,备忘录模式常用于实现撤销操作、历史记录、事务处理等需要保存和恢复对象状态的功能。

相关文章:

备忘录模式(Memento Pattern)

定义 备忘录模式&#xff08;Memento Pattern&#xff09;是一种行为设计模式&#xff0c;它允许在不破坏封装性的前提下捕获一个对象的内部状态&#xff0c;并在以后将对象恢复到该状态。备忘录模式通常用于实现撤销操作&#xff08;Undo&#xff09;或历史记录&#xff08;H…...

LeetCode 刷题 [C++] 第121题.买卖股票的最佳时机

题目描述 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获取的…...

ORACLE 基础

一.ORACLE简介 1.1什么是oracle ORACLE 数据库系统是美国 ORACLE 公司&#xff08;甲骨文&#xff09;提供的以分布式数据库为核心的一组软件产品&#xff0c;是目前最流行的客户/服务器(CLIENT/SERVER)或 B/S 体系结构的数据库之一。 ORACLE 通常应用于大型系统的数据库产品。…...

Adobe illustrator CEP插件调试

1.创建插件CEP面板&#xff0c;可以参考&#xff1a;http://blog.nullice.com/%E6%8A%80%E6%9C%AF/CEP-%E5%BC%80%E5%8F%91%E6%95%99%E7%A8%8B/%E6%8A%80%E6%9C%AF-CEP-%E5%BC%80%E5%8F%91%E6%95%99%E7%A8%8B-Adobe-CEP-%E6%89%A9%E5%B1%95%E5%BC%80%E5%8F%91%E6%95%99%E7%A8%8…...

学会玩游戏,智能究竟从何而来?

最近在读梅拉妮米歇尔《AI 3.0》第三部分第九章&#xff0c;谈到学会玩游戏&#xff0c;智能究竟从何而来&#xff1f; 作者: [美] 梅拉妮米歇尔 出版社: 四川科学技术出版社湛庐 原作名: Artificial Intelligence: A Guide for Thinking Humans 译者: 王飞跃 / 李玉珂 / 王晓…...

Unity 常用操作

2D素材网站 https://craftpix.net/ https://itch.io/game-assets/tag-2d/tag-backgrounds 3D素材资源网址 https://www.mixamo.com/#/ 场景常用操作&#xff1a; 快捷键&#xff1a;QWER Q&#xff1a;Q键或鼠标中键&#xff0c;可以拉动场景。 W&#xff1a;选中物体后&…...

【计算机网络_应用层】协议定制序列化反序列化

文章目录 1. TCP协议的通信流程2. 应用层协议定制3. 通过“网络计算器”的实现来实现应用层协议定制和序列化3.1 protocol3.2 序列化和反序列化3.2.1 手写序列化和反序列化3.2.2 使用Json库 3.3 数据包读取3.4 服务端设计3.5 最后的源代码和运行结果 1. TCP协议的通信流程 在之…...

Doris实战——银联商务实时数仓构建

目录 前言 一、应用场景 二、OLAP选型 三、实时数仓构建 四、实时数仓体系的建设与实践 4.1 数仓分层的合理规划 4.2 分桶分区策略的合理设置 4.3 多源数据迁移方案 4.4 全量与增量数据的同步 4.5 离线数据加工任务迁移 五、金融级数仓稳定性最佳实践 5.1 多租户资…...

代码随想录算法训练营第七天

● 自己看到题目的第一想法 第454题.四数相加II 方法&#xff1a; 方法一&#xff1a; 暴力法 思路&#xff1a; 注意&#xff1a; 代码&#xff1a; class Solution { public:int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<i…...

文件操作和IO(2):Java中操作文件

目录 一、File的属性 二、File的构造方法 三、File的方法 四、代码示例 1、getName&#xff0c;getParent&#xff0c;getPath方法 2、getAbsolutePath&#xff0c;getCanonicalPath方法 3、exists&#xff0c;isDirectory&#xff0c;createNewFile方法 4、createNewF…...

人工智能-零基础

机缘 扩充下知识栈&#xff0c;准备零基础开始 人工智能零基础 日常 日常水一下博客… 憧憬 努力成为一个会人工智能的程序员...

网络爬虫部分应掌握的重要知识点

目录 一、预备知识1、Web基本工作原理2、网络爬虫的Robots协议 二、爬取网页1、请求服务器并获取网页2、查看服务器端响应的状态码3、输出网页内容 三、使用BeautifulSoup定位网页元素1、首先需要导入BeautifulSoup库2、使用find/find_all函数查找所需的标签元素 四、获取元素的…...

git命令笔记

文章目录 0、参考文档1、常用指令git checkout系列git pull系列git push系列git reset系列git branch系列git log系列git revert 撤销某次提交git diff其他 2、查看和修改用户名和邮箱&#xff0c;生成密钥other 0、参考文档 Git使用教程&#xff1a;最详细、最傻瓜、最浅显、…...

微服务day03-Nacos配置管理与Nacos集群搭建

一.Nacos配置管理 Nacos不仅可以作为注册中心&#xff0c;可以进行配置管理 1.1 统一配置管理 统一配置管理可以实现配置的热更新&#xff08;即不用重启当服务发生变更时也可以直接更新&#xff09; dataId格式&#xff1a;服务名-环境名.yaml&#xff0c;分组一般使用默认…...

DFS剪枝

剪枝 将搜索过程中一些不必要的部分剔除掉&#xff0c;因为搜索过程构成了一棵树&#xff0c;剔除不必要的部分&#xff0c;就像是在树上将树枝剪掉&#xff0c;故名剪枝。 剪枝是回溯法中的一种重要优化手段&#xff0c;方法往往先写一个暴力搜索&#xff0c;然后找到某些特…...

基于SpringBoot多模块项目引入其他模块时@Autowired无法注入

基于SpringBoot多模块项目引入其他模块时Autowired无法注入 一、问题描述1、解决方案 一、问题描述 启动Spring Boot项目时报 Could not autowire. No beans of ‘xxxxxxxx’ type found. 没有找到bean的实例&#xff0c;即spring没有实例化对象&#xff0c;也就无法根据配置文…...

每日一题——LeetCode1566.重复至少K次且长度为M的模式

方法一 暴力枚举 var containsPattern function(arr, m, k) {const n arr.length;for (let l 0; l < n - m * k; l) {let offset;for (offset 0; offset < m * k; offset) {if (arr[l offset] ! arr[l offset % m]) {break;}}if (offset m * k) {return true;}}r…...

代码随想录刷题笔记-Day27

1. 全排列 46. 全排列https://leetcode.cn/problems/permutations/ 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[1,2,3],[1,3,2],[2,1,3],…...

【小沐学GIS】QGIS安装和入门使用

文章目录 1、简介2、下载和安装3、使用3.1 XYZ Tiles3.2 WMS / WMTS3.3 GeoJson文件加载 4、在线资源结语 1、简介 QGIS是一款开源地理信息系统。该项目于2002年5月诞生&#xff0c;同年6月作为SourceForge上的一个项目建立。QGIS目前运行在大多数Unix平台、Windows和macOS上。…...

黑马程序员——接口测试——day03——Postman断言、关联、参数化

目录&#xff1a; Potman断言 Postman断言简介Postman常用断言 断言响应状态码断言包含某字符串断言JSON数据Postman断言工作原理Postman关联 简介实现步骤核心代码创建环境案例1案例2Postman参数化 简介数据文件简介编写数据文件 CSV文件JSON文件导入数据文件到postman读取数…...

Stable Video vs. Runway ML vs. Kling:学习曲线强度TOP3工具横向测评(含GPU资源消耗比、提示词容错阈值、迭代收敛周期)

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;Stable Video vs. Runway ML vs. Kling&#xff1a;学习曲线强度TOP3工具横向测评&#xff08;含GPU资源消耗比、提示词容错阈值、迭代收敛周期&#xff09; 在生成式视频建模领域&#xff0c;Stable Video Di…...

Android HTTPS抓包原理与HTTPCanary证书配置全解

1. 这不是“绕过”&#xff0c;而是理解Android HTTPS抓包的底层逻辑HTTPCanary 是 Android 平台上少有的、真正能稳定抓取 HTTPS 流量的本地代理工具。但几乎所有新手在首次使用时都会卡在同一个地方&#xff1a;明明安装了 HTTPCanary 自带的证书&#xff0c;App 依然拒绝建立…...

掌握Sunshine虚拟手柄配置:实现完美游戏控制体验

掌握Sunshine虚拟手柄配置&#xff1a;实现完美游戏控制体验 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine Sunshine作为自托管的游戏串流服务器&#xff0c;其虚拟手柄配置功能是…...

puzzle(0312)找牛

目录 内固问题、最大内固问题 找牛 &#xff08;10&#xff09; &#xff08;17&#xff09; 内固问题、最大内固问题 参考内固、外固 寻找特定的内固集&#xff0c;即内固问题。 寻找最大内固数的内固集&#xff0c;即最大内固问题。 无向图的最大内固集&#xff08;即…...

Linuxptp从入门到排查:一份覆盖安装、配置与常见报错解决的保姆级指南

Linuxptp从入门到排查&#xff1a;一份覆盖安装、配置与常见报错解决的保姆级指南当你在数据中心里部署高精度时间同步服务时&#xff0c;突然发现日志里不断跳出master offset超限警告&#xff1b;或者当你按照教程配置完ptp4l后&#xff0c;时钟状态始终卡在s0无法锁定——这…...

题解:AcWing 271 杨老师的照相排列

本文分享的必刷题目是从蓝桥云课、洛谷、AcWing等知名刷题平台精心挑选而来&#xff0c;并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构&#xff0c;旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。 欢迎大…...

qmcdump:三步解锁QQ音乐加密文件,让您的音乐收藏重获自由

qmcdump&#xff1a;三步解锁QQ音乐加密文件&#xff0c;让您的音乐收藏重获自由 【免费下载链接】qmcdump 一个简单的QQ音乐解码&#xff08;qmcflac/qmc0/qmc3 转 flac/mp3&#xff09;&#xff0c;仅为个人学习参考用。 项目地址: https://gitcode.com/gh_mirrors/qm/qmcd…...

Warcraft Helper完整指南:让经典魔兽争霸3在现代系统完美运行

Warcraft Helper完整指南&#xff1a;让经典魔兽争霸3在现代系统完美运行 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为魔兽争霸3在Windows 1…...

Frida Hook Java层还原Android客户端签名算法

1. 这不是“调用API”&#xff0c;而是拆解签名生成的完整逻辑链 你有没有遇到过这种情况&#xff1a;App每次请求都带一个叫 api-sign 的字段&#xff0c;值像一串随机字符串&#xff0c;长度固定、格式规整&#xff0c;但无论你怎么翻网络请求日志、抓包重放、甚至改参数重…...

物联网安全新思路:轻量级机器学习算法实战评测与选型指南

1. 项目概述&#xff1a;当物联网遇上轻量级机器学习在物联网的世界里&#xff0c;安全从来不是一道选择题&#xff0c;而是一道生存题。想象一下&#xff0c;你家里的智能门锁、工厂里的传感器、街头的智能路灯&#xff0c;这些数以亿计的设备每时每刻都在产生和交换数据。它们…...