【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.rhkb.cn/news/149670.html

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

相关文章

阿里云GPU服务器新手购买流程(图文详解)

阿里云GPU服务器怎么购买&#xff1f;GPU云服务器购买流程很简单&#xff0c;在云服务器ECS页面&#xff0c;架构选择“GPU/FPGA/ASIC”&#xff0c;即可购买&#xff0c;阿里云服务器网分享阿里云GPU服务器购买流程&#xff0c;新手入门教程&#xff1a; 阿里云GPU服务器购买…

SpringCloud-Bus

接上文 SpringCloud-消息组件 1 注册Bus Bus需要基于一个具体的消息队列实现&#xff0c;比如RabbitMQ.还使用最开始的服务拆分项目&#xff0c;比如现在借阅服务的某个接口调用时&#xff0c;能给用户服务和图书服务发送一个通知。 首先父项目导入SpringCloud依赖 <depend…

C/C++学习 -- SHA-256算法

SHA-256算法概述 SHA-256代表"Secure Hash Algorithm 256-bit"&#xff0c;是一种安全的哈希算法&#xff0c;输出固定长度的256位&#xff08;32字节&#xff09;哈希值。SHA-256被广泛用于加密、数字签名、密码学以及区块链等领域&#xff0c;因为它提供了高度的安…

黑马点评-02使用Redis代替session,Redis + token机制实现

Redis代替session session共享问题 每个Tomcat中都有一份属于自己的session,所以多台Tomcat并不共享session存储空间,当请求切换到不同tomcat服务时可能会导致数据丢失 用户第一次访问1号tomcat并把自己的信息存放session域中, 如果第二次访问到了2号tomcat就无法获取到在1号…

基于A4988/DRV8825的四路步进电机驱动器

概述 简化板的CNC sheild V3.0&#xff0c;仅保留步进电机速度与方向的控制引脚STEP/DIR、使能端EN、芯片供电VCC\GND&#xff0c;共计11个引脚。PCB四周开设四个M3通孔&#xff0c;以便于安装固定。此外&#xff0c;将板载的焊死的保险丝更改为可更换的保险座保险丝&#xff…

【Pinia】小菠萝详细使用说明

文章目录 1. 介绍1.1 Pinia介绍1.2 pinia的属性说明 2. 安装3. 初步使用4. store具体使用4.1 值修改4.2.1 直接修改4.2.2 通过$patch整体修改4.2.3 通过$patch函数式4.2.4 通过$state整体修改4.2.5 通过actions修改 4.2 解构store 5 actions使用6. getters使用6.1 通过this获取…

少数人的晚餐-数据

前篇&#xff1a; 少数人的晚餐_zhangrelay的博客-CSDN博客 阅读量惨淡&#xff0c; 2023-07-04 22:48:49 发布 到此文撰写时候&#xff0c;446 补充&#xff1a; 少数人的晚餐-补充-CSDN博客 更加凄惨&#xff0c; 2023-09-28 11:02:23 发布 到此文撰写时候&#xff0c;…

Geteway

大家好我是苏麟今天带来Geteway. Gateway服务网关 Spring Cloud Gateway 是 Spring Cloud 的一个全新项目&#xff0c;该项目是基于 Spring 5.0&#xff0c;Spring Boot 2.0 和 Project Reactor 等响应式编程和事件流技术开发的网关&#xff0c;它旨在为微服务架构提供一种简单…

一年一度的国庆节又结束了

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

Go语言中的指针介绍

Go语言中的指针 文章目录 Go语言中的指针一、Go语言中的指针介绍1.1 指针介绍1.2 基本语法1.3 声明和初始化1.4 Go 指针的3个重要概念1.4.1 指针地址&#xff08;Pointer Address&#xff09;1.4.2 指针类型&#xff08;Pointer Type&#xff09;1.4.3 指针取值&#xff08;Poi…

Day-08 基于 Docker安装 Nginx 镜像-负载均衡

1、反向代理后&#xff0c;自然而然就引出了负载均衡,下面简单实现负载均衡的效果; 2、实现该效果需要再添加一个 Nginx &#xff0c;所以要增加一个文件夹。 /home|---mutou|----nginx|----conf.d|----html|----conf.d2|----html3 1.创建 html3 文件夹&#xff0c; 新建 index…

mysql面试题20:有哪些合适的分布式主键方案

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:有哪些合适的分布式主键方案? UUID:UUID通常是由一个二进制的128位整数表示,可以保证全局的唯一性。在Java中,可以通过UUID类生成一个UUID。例…

数据结构P46(2-1~2-4)

2-1编写算法查找顺序表中值最小的结点&#xff0c;并删除该结点 #include <stdio.h> #include <stdlib.h> typedef int DataType; struct List {int Max;//最大元素 int n;//实际元素个数 DataType *elem;//首地址 }; typedef struct List*SeqList;//顺序表类型定…

Linux系统之安装cook菜谱工具

Linux系统之安装cook菜谱工具 一、cook菜谱工具介绍二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍 三、检查本地环境3.1 检查本地操作系统版本3.2 检查系统内核版本3.3 检查系统是否安装pnpm 四、部署Node.js环境4.1 下载Node.js安装包4.2 解压Node.js安装包4.3 复制二进制…

为什么网络安全明明缺口很大,却看起来招聘很少呢?

2023 年我国网络空间安全人才数量缺口超过了 140 万&#xff0c;就业人数却只有 10 多万&#xff0c;缺口高达了 93%。这里就有人会问了&#xff1a; 1、网络安全行业为什么这么缺人&#xff1f; 2、明明人才那么稀缺&#xff0c;为什么招聘时招安全的人员却没有那么多呢&…

一文解释mapState的来龙去脉

mapState Vuex 提供的辅助函数之一&#xff0c;将 store 中的状态映射到组件的计算属性中&#xff0c;使得在组件中可以轻松地访问 Vuex store 中的状态值 MapState(映射状态) 在我们的 Count.vue 组件中&#xff0c;可以使用 mapState 来更简洁地获取 count 的状态值 首先&…

【c++_containers】10分钟带你学会list

前言 链表作为一个像是用“链子”链接起来的容器&#xff0c;在数据的存储等方面极为便捷。虽然单链表单独在实际的应用中没用什么作用&#xff0c;但是当他可以结合其他结构&#xff0c;比如哈希桶之类的。不过今天学习的list其实是一个带头双向链表。 言归正传&#xff0c;让…

【ARM】(1)架构简介

前言 ARM既可以认为是一个公司的名字&#xff0c;也可以认为是对一类微处理器的通称&#xff0c;还可以认为是一种技术的名字。 ARM公司是专门从事基于RISC技术芯片设计开发的公司&#xff0c;作为知识产权&#xff08;IP&#xff09;供应商&#xff0c;本身不直接从事芯片生产…

iphone怎么传大量照片到电脑,这四招你要学会

如果你喜欢用iPhone拍照、总会遇到要把大量照片从iPhone传输到电脑的情况&#xff0c;要是你对这方面不熟悉就很容易浪费时间。下面小编就介绍几种方法可以快速高效的传大量照片到电脑上去。 iPhone传输照片到电脑 方法一&#xff1a;使用iMazing传输 推荐度★★★★★ 有了i…

不断优化的素数算法

前言&#xff1a;素数判断是算法中重要的一环&#xff0c;掌握优秀的素数判断方法是算法player的必修课。本文介绍的是由简到繁的素数算法&#xff0c;便于初学者从入门到精通。 素数&#xff08;质数&#xff09;&#xff1a;只能被 1 和它本身整除的数称作素数&#xff0c;如…