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

news2025/1/18 20:23:10

简介

备忘录模式(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.coloradmin.cn/o/1064547.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

结构化面试 --- 介绍 + 人际关系

目录 一、介绍 1、认识考试 2、认识考官 3、认识对手 4、认识考场 5、认识规则 6、如何备考 二、人际关系 练习题 第一题&#xff08;换岗&#xff09; 第二题&#xff08;办法&#xff09; 第三题&#xff08;相处&#xff09; 第四题 第五题 第六题 …

初级数值计算理论总结

本文用于总结复习与研究生面试 一问&#xff0c;小伙子会不会数值计算啊一答&#xff1a;会二问&#xff1a;哦&#xff0c;讲讲看二答&#xff1a;讲不出来三问&#xff1a;...... 数值求根 二分法Jacobi 迭代法 Jacobi 迭代改进算法&#xff08;事后加速法&#xff09;&#…

[架构之路-228]:目标系统 - 纵向分层 - 计算机硬件与体系结构 - 硬盘存储结构原理:如何表征0和1,即如何存储0和1,如何读数据,如何写数据(修改数据)

目录 前言&#xff1a; 一、磁盘的盘面组成 1.1 磁盘是什么 ​编辑1.2 磁盘存储介质 1.3 磁盘数据的组织 1.3.1 分层组织&#xff1a;盘面号 1.3.2 扇区和磁道 1.3.3 数据 1.3.4 磁盘数据0和1的存储方式 1.3.5 磁盘数据0和1的修正方法 1.3.6 磁盘数据0和1的读 二、…

【AI视野·今日Robot 机器人论文速览 第四十九期】Fri, 6 Oct 2023

AI视野今日CS.Robotics 机器人学论文速览 Fri, 6 Oct 2023 Totally 29 papers &#x1f449;上期速览✈更多精彩请移步主页 Interesting: &#x1f4da;ContactGen, 基于生成模型的抓取手势生成&#xff0c;类人五指手。(from 伊利诺伊大学 香槟) 数据集&#xff1a;GRAB da…

多线程 - 定时器

多线程 - 定时器 定时器的背景知识 定时器 ~~ (就类似于定闹钟) 平时的闹钟,有两种风格: 指定特定时刻,提醒指定特定时间段之后,提醒 这里的“定时器”,不是提醒,而是执行一个实现准备好的方法/代码,它是开发中一个常用的组件,尤其是在网络编程的时候,使用浏览器上网,打开…

【立体视觉(五)】之立体匹配与SGM算法

【立体视觉&#xff08;五&#xff09;】之立体匹配与SGM算法 一、立体匹配一&#xff09;基本步骤二&#xff09;局部立体匹配三&#xff09;全局立体匹配四&#xff09;评价标准1. 均方误差(RMS)2. 错误匹配率百分比(PBM) 二、半全局(SGM)立体匹配一&#xff09;代价计算二&a…

雷达干扰和烧穿范围简介

一、干扰信号比 J/S或J-to-S是从目标发射的干扰信号接收的功率(J)与从目标的雷达反向散射接收的功率的比率。 二、烧穿范围 通过电子攻击(J)可以首先检测到目标回波信号(S)的雷达到目标的距离。 三、自保护干扰 也称为主瓣干扰(雷达回波源和干扰机并置)。 烧穿范围…

汽车驾驶任务的隐马尔可夫模型识别方法研究

汽车驾驶任务的隐马尔可夫模型识别方法研究 一、Introduction 自动驾驶汽车经过了几十年的发展&#xff0c;是目前国内外汽车行业中的重要研究方向。自 动驾驶汽车的智能化需要车辆能够有类“人”的行为&#xff0c;在决策策略上可以满足人的心理 需求。人在驾驶过程中&#…

Aasee Api开放平台上线啦!

使用方法 首先介绍使用方法&#xff0c;只需导入一个SDK即可使用实现调用第三方的接口&#xff0c;那如何导入SDK呢&#xff0c;目前jar已经上传至maven中心仓库可直接引入到pom文件中使用&#xff0c;下面是例子&#xff1a; <dependency><groupId>io.github.Aa…

攻防世界-T1 Training-WWW-Robots

文章目录 步骤1步骤二结束语 步骤1 看到文本——>提取有效信息——>利用有效信息 文本&#xff1a;In this little training challenge, you are going to learn about the Robots_exclusion_standard. The robots.txt file is used by web crawlers to check if they …

jar 命令启动java 指定配置文件路径 jar如何启动

一、各种启动方式 1.java -jar # 例子 java -jar test.jar 1. 2. 这是最简单的启动方式&#xff0c;同时弊端也是很多的。 弊端1&#xff1a;exit 退出终端会导致java进程中断。 弊端2&#xff1a;ctrlc 退出启动展示页会导致java进程中断。 弊端3&#xff1a;直接关闭终端会…

FREERTOS内容解惑与综合应用(基于STM32F103)

本文基础内容参考的是正点原子的FREERTOS课程。 这是基于HAL库的 正点原子手把手教你学FreeRTOS实时系统 这是基于标准库的 正点原子FreeRTOS手把手教学-基于STM32 基础知识&#xff0c;直接参考正点原子《FreeRTOS开发指南V1.1》基于标准库的&#xff0c;此处不再赘述。 本文…

【Java 进阶篇】HTML介绍与软件架构相关知识详解

HTML&#xff08;Hypertext Markup Language&#xff09;是一种用于创建网页的标记语言。它是互联网上信息传递和展示的基础&#xff0c;无论是在浏览器中查看网页还是在移动设备上浏览应用程序&#xff0c;HTML都扮演着关键角色。本文将向您介绍HTML的基础知识&#xff0c;并探…

踩大坑ssh免密登录详细讲解

目 录 问题背景 环境说明 免密登录流程说明 1.首先要在对应的用户主机名的情况下生成密钥对&#xff0c;在A服务器执行 2.将A服务器d公钥拷贝到B服务器对应的位置 3.在A服务器访问B服务器 免密登录流程 0.用户说明 1.目前现状演示 2.删除B服务器.ssh 文件夹下面的…

多普勒频率相关内容介绍

图1 多普勒效应 1、径向速度 径向速度是作用于雷达或远离雷达的速度的一部分。 图2 不同的速度 2、喷气发动机调制 JEM是涡轮机的压缩机叶片的旋转的多普勒频率。 3、多普勒困境 最大无模糊范围需要尽可能低的PRF&#xff1b; 最大无模糊速度需要尽可能高的PRF&#xff1b…

什么是TF-A项目的长期支持?

安全之安全(security)博客目录导读 问题&#xff1a;Trusted Firmware-A社区每六个月发布一次代码。然而&#xff0c;对于生产中的平台&#xff0c;该策略在维护、重要软件修复的向后兼容性、获得最新的安全缓解措施和整体产品生命周期管理方面不具备可扩展性。 开源软件项目&…

假期题目整合

1. 下载解压题目查看即可 典型的猪圈密码只需要照着输入字符解开即可得到答案 2. 冷门类型的密码题型&#xff0c;需要特意去找相应的解题思路&#xff0c;直接百度搜索天干地支解密即可 3. 一眼能出思路他已经给了篱笆墙的提示提示你是栅栏密码对应解密即可 4. 最简单的社会主…

【17】c++设计模式——>原型模式

原型模式的定义 c中的原型模式&#xff08;Prototype Pattern&#xff09;是一种创建型设计模式&#xff0c;其目的是通过复制&#xff08;克隆&#xff09;已有对象来创建新的对象&#xff0c;而不需要显示的使用构造函数创建对象&#xff0c;原型模式适用于创建复杂对象时&a…

Linux软硬链接和动静态库

本文已收录至《Linux知识与编程》专栏&#xff01; 作者&#xff1a;ARMCSKGT 演示环境&#xff1a;CentOS 7 软硬链接和动静态库 前言正文软硬链接原理使用 文件时间动静态库库介绍静态库静态库制作静态库的使用关于静态链接 动态库动态库制作动态库的使用关于动态链接 补充 最…

React18学习

17、React_JSX的注意事项 <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>JSX的注意</title><script src="./script/react.development.js"></script><script src=&…