【C++设计模式之备忘录模式:行为型】分析及示例

简介

备忘录模式(Memento Pattern)是一种行为型设计模式,它用于保存和恢复对象的状态。备忘录模式通过将对象的状态封装成一个备忘录(Memento),并将备忘录保存在一个管理者(Caretaker)中,来实现对对象状态的保存和恢复。

备忘录模式的核心思想是将对象的状态封装成一个备忘录对象,而不是直接暴露状态给其他对象。这样,其他对象就无法直接操作对象的状态。同时,备忘录模式还提供了一个管理者对象,用于保存和管理备忘录,可以实现对对象状态的保存和恢复。

描述

备忘录模式由三个核心组件组成:Originator(原始对象)、Memento(备忘录和Caretaker(管理者)。

  • Originator类保存了需要保存状态的对象,并能够根据当前状态创建备忘录和从备忘录中恢复原始状态。
  • Memento类是备忘录对象,负责保存Originator对象的状态。
  • Caretaker类是管理者对象,负责保存备忘录对象,提供了对备忘录的保存、获取和恢复功能。

原理

备忘录模式通过将对象的状态保存在备忘录对象中,将备忘录对象保存在管理者对象中,来实现对对象状态的保存和恢复。当需要保存当前状态时,Originator对象会创建一个包含状态的备忘录对象,并将备忘录对象交给Caretaker对象保存。当需要恢复到之前的状态时,Originator对象会从Caretaker对象获取对应的备忘录对象,并根据备忘录对象中保存的状态恢复原始状态。

1.创建一个备忘录,该类用于存储原发器的状态。
2.创建一个原发器类,该类拥有需要保存和恢复的状态,并提供保存状态和恢复状态的方法。
3.创建一个管理者类,用于管理备忘录对象的保存和获取。
4.在需要保存原发器状态的时候,原发器创建一个备忘录对象,并将自己的状态传递给备忘录对象。
5.管理者对象保存备忘录对象。
6.在需要恢复原发器状态的时候,管理者对象将备忘录对象交还给原发器。

类图

在这里插入图片描述

示例

假设有一个文本编辑器,用户可以输入文本并进行编辑操作。当用户希望撤销一些编辑操作时,可以使用备忘录模式保存编辑器状态。

在示例中,有三个主要类:

  1. Editor(原发器):表示文本编辑器,具有保存和恢复状态的方法,以及一个用于保存和获取备忘录的方法。
  2. EditorState(备忘录):表示编辑器的状态,保存了编辑器的文本内容。
  3. EditorHistory(管理者):管理备忘录对象的保存和获取。

C++示例代码:

#include <iostream>
#include <stack>
#include <string>// 备忘录
class Memento {
public:Memento(const std::string& text) : text(text) {}std::string getText() const {return text;}private:std::string text;
};// 原始对象
class TextEditor {
public:void setText(const std::string& text) {this->text text;}Memento createMemento() {return Memento(text);}void restoreFromMemento(const Memento& memento) {text = m.getText();}void printText() {stdcout << text << std::endl;}private:std::string text;
};// 管理者
class Caretaker {
public:void saveMemento(const Memento& memento){mementos.push(memento);}Memento getMemento() {if (!mementos.empty()) {Memento memento = mementos.top();mementos.pop();return memento;} else {return Memento("");}}private:std::stack<Memento> mementos;
};int main() {TextEditor editor;Caretaker caretaker;// 设置初始文本editor.setText("Hello, World!");// 保存文本状态caretaker.saveMemento(editor.createMemento());// 修改文本editor.setText("Hello, Memento!");// 打印当前文本std::cout << "Current Text: ";editor.printText();// 恢复到之前的状态Memento m = caretaker.getMemento();editor.restoreFromMemento(memento);// 再次打印文本std::cout << "Restored Text: ";editor.printText();return 0;
}

输出结果

Current Text: Hello, Memento!Restored Text: Hello, World!

解释

在上述示例中,TextEditor类是原始对象(Originator),它保存了需要保存状态的文本,并提供了创建备忘录和从备忘录中恢复状态的方法。Memento类是备忘录(Memento),它负责保存TextEditor对象的状态。Caretaker类是管理者(Caretaker),它负责保存备忘录对象,并提供了对备忘录的保存和获取功能。

首先设置初始文本为"Hello, World!“,并保存初始状态。然后,我们修改文本为"Hello, Memento Pattern!”,并打印当前文本。接下来,我们从Caretaker对象获取之前保存的备忘录对象,并将文本恢到之前的状态。最后,再次打印文本,可以看到文本已经恢复为之前保存的状态。

结论

备忘录模式通过将对象的状态保存到备忘录对象中,并在的时候将其恢复,实现了对对象状态的保存和恢复功能,同时保持了对象的封装性。该模式可以用于需要可撤销操作或历史记录功能的场景。

应用场景

  • 需要保存和恢复对象状态的场景,例如文本编辑器、操作撤销功能等。
  • 需要实现多级撤销操作的场景,例如图形编辑器中的多层次撤销操作。
  • 需要保存对象历史记录的场景,例如编辑器的编辑历史记录。
  • 需要实现对象副本功能的场景,在特定时候将对象恢复到某个历史状态。

总之,备忘录模式提供了一种简单且有效的方法来保存和恢复对象的状态,可以在需要保存对象状态的场景中很好地发挥作用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/130185.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微电网单台并网逆变器PQ控制matlab仿真模型

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 微电网运行在并网模式下且公共电网供应正常时&#xff0c;因为公共电网给定了电 压和频率的参考值&#xff0c;所有的逆变器可以使用PQ控制方式。 当系统频率为额定频率f0时&#xff0c;系统稳定在A点&#x…

【初识Jmeter】【接口自动化】

jmeter的使用笔记1 Jmeter介绍与下载安装介绍安装配置配置与扩展组件 jmeter的使用基本功能元素登陆请求与提取cookie其他请求接口关联Cookie-响应成功聚合报告查看 Jmeter介绍与下载安装 介绍 jmeter是apache公司基于java开发的一款开源压力测试工具&#xff0c;体积小&…

【MySQL】表的基础增删改查

前面我们已经知道怎么来创建表了&#xff0c;接下来就来对创建的表进行一些基本操作。 这里先将上次创建的表删除掉&#xff1a; mysql> use test; Database changedmysql> show tables; ---------------- | Tables_in_test | ---------------- | student | -----…

[MongoDB]-权限验证管理

[MongoDB]-权限验证管理 senge | 2023年9月 背景说明&#xff1a;现有两套MongoDB副本集群给开发人员使用时未开启认证。 产生影响&#xff1a;用户若输入账号以及密码则会进行校验&#xff0c;但用户可以在不输入用户名和密码的情况下也可直接登录。 倘若黑客借此进行攻击勒索…

自动求导,计算图示意图及pytorch实现

pytorch实现 x1 torch.tensor(3.0, requires_gradTrue) y1 torch.tensor(2.0, requires_gradTrue) a x1 ** 2 b 3 * a c b * y1 c.backward() print(x1.grad) print(y1.grad) print(x1.grad 6 * x1 * y1) print(y1.grad 3 * (x1 ** 2))输出为&#xff1a; tensor(36.) …

C语言——文件操作_学习笔记

一、引言——为什么使用文件 如果没有文件&#xff0c;我们写的程序的数据是存储在电脑的内存中&#xff0c;如果程序退出&#xff0c;内存回收&#xff0c;数据就丢失了&#xff0c;等再次运行程序&#xff0c;是看不到上次程序的数据的&#xff0c;如果要将数据进行持久化的…

【Spring Boot】日志文件

日志文件 一. 日志文件有什么用二. 日志怎么用三. ⾃定义⽇志打印1. 在程序中得到⽇志对象2. 使⽤⽇志对象打印⽇志3. ⽇志格式说明 四. 日志级别1. ⽇志级别有什么⽤2. ⽇志级别的分类与使⽤ 五. 日志持久化六. 更简单的⽇志输出—lombok1. 添加 lombok 依赖2. 输出⽇志3. lom…

VueRouter与expres/koa中间件的关联

ueRouter: runQueue 路由守卫都是有三个参数to,from,next。其中next就是下方的fn执行时候传入的第二个参数(回调函数)&#xff0c;只有该回调执行后才会挨个遍历queue内的守卫。 中间件的作用 隔离基础设施与业务逻辑之间的细节。详细的内容位于《深入浅出Node.js》P210 另外一…

深度学习-卷积神经网络-AlexNET

文章目录 前言1.不同卷积神经网络模型的精度2.不同神经网络概述3.卷积神经网络-单通道4.卷积神经网络-多通道5.池化层6.全连接层7.网络架构8.Relu激活函数 1.LeNet-52.AlexNet1.架构2.局部响应归一化&#xff08;VGG中取消了&#xff09;3.重叠/不重叠池化4.过拟合-数据增强5.过…

Scala第二十章节

Scala第二十章节 scala总目录 文档资料下载 章节目标 理解Akka并发编程框架简介掌握Akka入门案例掌握Akka定时任务代码实现掌握两个进程间通信的案例掌握简易版spark通信框架案例 1. Akka并发编程框架简介 1.1 Akka概述 Akka是一个用于构建高并发、分布式和可扩展的基于事…

jvm--对象实例化及直接内存

文章目录 1. 创建对象2. 对象内存布局3. 对象的访问定位4. 直接内存&#xff08;Direct Memory&#xff09; 1. 创建对象 创建对象的方式&#xff1a; new最常见的方式、Xxx 的静态方法&#xff08;单例模式&#xff09;&#xff0c;XxxBuilder/XxxFactory 的静态方法Class 的…

Linux 部署 MinIO 分布式对象存储 配置为 typora 图床

前言 MinIO 是一款高性能的对象存储系统&#xff0c;它可以用于大规模的 AI/ML、数据湖和数据库工作负载。它的 API 与Amazon S3 云存储服务完全兼容&#xff0c;可以在任何云或本地基础设施上运行。MinIO 是开源软件&#xff0c;也提供商业许可和支持 MinIO 的特点有&#x…