2023-7-24-第二十二式备忘录模式

news2024/11/24 10:03:01


🍿*★,°*:.☆( ̄▽ ̄)/$:*.°★* 🍿

💥💥💥欢迎来到🤞汤姆🤞的csdn博文💥💥💥
💟💟喜欢的朋友可以关注一下,下次更新不迷路💟💟
😆😆😆私聊获取个人订阅号哦,欢迎订阅共同学习😆😆😆
💖💖💖💖可以加入大家庭群聊,一起学习天天有福利💖💖💖💖





🍬本文摘要

在这里插入图片描述

设计方法二十三式之备忘录模式


目录

  • 🍬本文摘要
  • 😉一、基础概念
  • 🐱‍🐉二、备忘录模式实现
  • 🎉三、模块之间的关系
  • 🐱‍🚀四、注意事项
  • 🎂五、使用场景
  • 🍳参考文献
  • 🧊文章总结



😉一、基础概念

备忘录模式是一种软件设计模式,用于在不破坏封装性的情况下保存和恢复对象的内部状态。它允许将对象的状态保存到一个称为备忘录的中介者(或备份)中,并在需要时从中恢复。这样可以有效地实现撤销操作、历史记录功能或者以某种方式回滚对象的状态。

备忘录模式由三个主要角色组成:

  1. 发起人(Originator):发起人是包含需要保存状态的对象。它可以创建并保存当前状态到备忘录中,或者从备忘录中恢复之前保存的状态。

  2. 备忘录(Memento):备忘录是存储发起人对象状态的中介者。它提供了一种封装机制,确保只有发起人对象可以访问其内部状态。

  3. 管理者(Caretaker):管理者负责保存和恢复备忘录。它可以存储多个备忘录对象,并按需调用备忘录的保存和恢复方法。

使用备忘录模式可以使对象的状态管理更加灵活,同时也遵循了面向对象设计原则中的封装与单一职责原则。该模式在需要实现撤销、重做、历史记录等功能时非常有用,并且能够简化代码的复杂性。


🐱‍🐉二、备忘录模式实现

在 C++ 中实现备忘录模式,我们可以按照以下步骤进行:

  1. 定义发起人类(Originator):发起人类是需要保存状态的对象。它包含要保存和恢复的数据成员,并提供创建备忘录、从备忘录中恢复状态的方法。
class Originator {
private:
    std::string state;

public:
    void setState(const std::string& newState) {
        state = newState;
    }

    std::string getState() const {
        return state;
    }

    Memento createMemento() const {
        return Memento(state);
    }

    void restoreFromMemento(const Memento& memento) {
        state = memento.getState();
    }
};
  1. 定义备忘录类(Memento):备忘录类用于存储发起人对象的状态。它包含一个或多个与发起人对象相关的数据成员,并提供获取和设置状态的方法。
class Memento {
private:
    std::string state;

public:
    Memento(const std::string& newState) : state(newState) {}

    std::string getState() const {
        return state;
    }
};
  1. 定义管理者类(Caretaker):管理者类负责保存和恢复备忘录。它可以存储多个备忘录对象,并提供保存和获取备忘录的方法。
class Caretaker {
private:
    std::vector<Memento> mementos;

public:
    void addMemento(const Memento& memento) {
        mementos.push_back(memento);
    }

    Memento getMemento(int index) const {
        return mementos[index];
    }
};

现在,我们可以使用这些类进行测试:

int main() {
    Originator originator;
    Caretaker caretaker;

    // 设置初始状态
    originator.setState("State A");
    
    // 保存当前状态到备忘录
    caretaker.addMemento(originator.createMemento());

    // 修改状态
    originator.setState("State B");

    // 再次保存当前状态到备忘录
    caretaker.addMemento(originator.createMemento());

    // 恢复到第一个备忘录的状态
    originator.restoreFromMemento(caretaker.getMemento(0));

    std::cout << "Current state: " << originator.getState() << std::endl;  // 输出:Current state: State A

    return 0;
}

在上述示例中,我们创建了一个发起人对象 originator 和一个管理者对象 caretaker。通过设置和修改发起人对象的状态,并使用备忘录保存和恢复操作,我们可以验证备忘录模式的实现。


🎉三、模块之间的关系

在备忘录模式中,有三个主要的角色:发起人(Originator)、备忘录(Memento)和管理者(Caretaker)。它们之间的关系如下:

  1. 发起人(Originator):发起人是包含需要保存状态的对象。它负责创建备忘录对象并将自身的状态保存到备忘录中,或者从备忘录中恢复之前保存的状态。发起人可以直接访问备忘录对象的状态。

  2. 备忘录(Memento):备忘录是存储发起人对象状态的中介者。它提供了一种封装机制,确保只有发起人对象可以访问其内部状态。备忘录类通常只包含与发起人对象相关的数据成员,并提供获取和设置状态的方法。

  3. 管理者(Caretaker):管理者负责保存和恢复备忘录。它可以存储多个备忘录对象,并按需调用备忘录的保存和恢复方法。管理者对象不知道具体的备忘录结构,只负责管理备忘录对象的集合。

下面是备忘录模式中这些角色之间的交互流程:

  1. 发起人对象通过调用 createMemento 方法创建一个备忘录对象,并将自身的状态保存到备忘录中。
  2. 发起人对象可以通过调用 getState 方法获取当前状态,并通过 setState 方法修改状态。
  3. 发起人对象可以使用备忘录对象的数据,但不能直接访问备忘录对象内部的数据成员。
  4. 管理者对象负责保存备忘录对象。它使用 addMemento 方法将备忘录对象添加到一个集合中,并使用 getMemento 方法从集合中获取备忘录对象。
  5. 恢复先前状态时,发起人对象调用 restoreFromMemento 方法,并传递所需的备忘录对象。发起人对象根据备忘录对象中保存的状态恢复自身的状态。

因此,备忘录模式的关系是一种单向的、松散的耦合关系,其中发起人对象控制着备忘录的创建和恢复过程,而管理者对象负责保存和提供备忘录对象,以实现状态的保存和恢复。


🐱‍🚀四、注意事项

在使用备忘录模式时,有一些注意事项需要考虑:

  1. 备忘录对象的封装性:备忘录对象应该被设计为只有发起人对象能够访问和修改其内部状态。这样可以确保备忘录模式的封装性,防止其他对象直接访问和修改备忘录对象的状态。

  2. 对象状态的保存和恢复:发起人对象应该负责将自身的状态保存到备忘录中,并从备忘录中恢复状态。确保在合适的时间和位置调用相应的保存和恢复方法,以实现正确的状态管理。

  3. 管理者对象的职责:管理者对象负责保存和提供备忘录对象,但并不了解备忘录的具体结构。管理者对象应该限制对备忘录的访问,并只提供必要的方法来保存和获取备忘录对象。

  4. 内存消耗的考虑:备忘录模式可能会导致内存消耗较大,特别是当需要保存大量的状态或历史记录时。在设计时需要权衡内存效率和功能需求,避免过度使用备忘录对象。

  5. 可撤销操作的处理:备忘录模式常用于实现撤销操作、重做功能或历史记录。在实现中,需要确保发起人对象和管理者对象之间的协调,以便正确地保存和恢复状态,实现可撤销操作的逻辑。

综上所述,备忘录模式是一种有用的设计模式,可以实现对象状态的保存和恢复。在使用时需要注意封装性、状态的保存与恢复、管理者对象的职责、内存消耗以及可撤销操作的处理等方面的考虑。


🎂五、使用场景

备忘录模式适用于以下场景:

  1. 需要实现撤销和恢复功能:备忘录模式可以用于保存对象的历史状态,以便在需要时进行撤销操作或恢复到之前的状态。例如,在文本编辑器中可以使用备忘录模式实现撤销和重做功能。

  2. 需要记录对象状态历史记录:如果需要跟踪和记录对象的状态变化历史,备忘录模式是一种有效的设计模式。它可以让对象保存不同时间点的状态,并在需要时查看或还原这些状态。例如,在游戏中可以使用备忘录模式记录玩家的游戏进度。

  3. 需要实现快照功能:备忘录模式可以用于实现快照功能,即在特定时间点保存对象的完整状态。这样可以随时恢复对象到该时间点的状态。例如,在虚拟机中可以使用备忘录模式保存虚拟机的快照,以便在需要时恢复到该快照。

  4. 需要实现数据版本控制:备忘录模式可以用于实现数据版本控制,特别是在多用户环境下对数据进行并发修改的情况。备忘录模式可以帮助记录和管理不同版本的数据状态,从而实现数据的版本控制和冲突解决。

总而言之,备忘录模式适用于需要保存、恢复或跟踪对象状态的场景。它提供了一种灵活的方式来管理对象状态,并可以在需要时进行撤销、历史记录或版本控制等操作。


🍳参考文献

🧊文章总结

提示:这里对文章进行总结:

   本文讲了关于备忘录模式的知识。






更多好文推荐

🍸2021-4月Python 机器学习——中文新闻文本标题分类
🍹2021年4月-(计算机网络)小型校园网络模拟搭建,最全最准确版
🍺2022-10-31-基于用户的协同过滤推荐算法实现+MAE+RMSE
🍻2022-11-28-大数据可视化,特征维度大于50
🥂2023-3-9-一篇简短的文章把C++左右值关系讲的透透彻彻

上一篇
End
下一篇

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

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

相关文章

VS Code 设置大小写转换快捷键

VS Code 设置大小写转换快捷键 前言&#xff1a;VS Code 没有默认的大小写转换快捷键&#xff0c;需要我们自己添加。 一 、打开快捷键设置面板 二、添加快捷键 在搜索框输入 “转换为大写”&#xff0c;如果您的VS Code没有汉化&#xff0c;此处输入“Transform to Uppercase…

vmware平台上虚拟机无法查看到WWID

需要在虚拟机中部署rac测试环境&#xff0c;创建虚拟机后无法查看到wwid [rootdb1 ~]# for i in cat /proc/partitions |awk {print $4} |grep sd; do echo "Device: $i WWID: /usr/lib/udev/scsi_id --page0x83 --whitelisted --device/dev/$i "; done |sort -k4 De…

Bootstrap每天必学之面板

Bootstrap每天必学之面板 1、面板 面板&#xff08;Panels&#xff09;是Bootstrap框http://架新增的一个组件&#xff0c;其主要作用就是用来处理一些其他组件无法完成的功能。同样在不同的版本中具有不同的源码&#xff1a; ☑ Less版本&#xff1a;对应的源码文件是 panel…

深度学习论文分享(五)DDFM: Denoising Diffusion Model for Multi-Modality Image Fusion

深度学习论文分享&#xff08;五&#xff09;DDFM: Denoising Diffusion Model for Multi-Modality Image Fusion 前言Abstract1. Introduction2. Background2.1. Score-based diffusion models2.2. Multi-modal image fusion2.3. Comparison with existing approaches 3. Meth…

解决ros-melodic-desktop-full(18.04)安装过程中未满足的依赖关系问题(注:也可以解决20.04noetic的)

自己安装火焰截图软件时使用sudo apt-get install flameshot时出现&#xff1a; 正在读取软件包列表... 完成 正在分析软件包的依赖关系树 正在读取状态信息... 完成 您也许需要运行“apt --fix-broken install”来修正上面的错误。 下列软件包有未满足的依赖关系&#xff1a;…

Vue组件通信原理及应用场景解析

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

SolidWorks打开step.格式文件提示“输入的文件名无效、无法发现、被锁住或为不兼容的类型”的解决办法

有时候用SolidWorks打开step.格式文件会提示“输入的文件名无效、无法发现、被锁住或为不兼容的类型”&#xff0c;从而无法正常打开此文件&#xff0c;如图&#xff1a; 目前小编找了两种解决这个问题的办法&#xff0c;供大家参考&#xff1a; 方法一&#xff1a; 打开Solid…

istio安装部署总结

istio安装部署总结 大纲 istio基础概念版本选择安装istio核心主件卸载istiokiali安装 istio基础概念 https://istio.io/latest/zh/docs/ 中文文档 istio是一个服务治理平台&#xff0c;治理服务间的访问&#xff0c;&#xff08;例如流量控制&#xff0c;安全策略&#xf…

第五讲:MySQL中DDL表的修改与删除

1、alter&#xff1a;改变 2、table&#xff1a;表 3、truncate&#xff1a;截断&#xff0c;删节 学习渠道&#xff1a;黑马程序员

如何创建高级 CSS 下拉菜单

效果展示 实现思路及部分代码 1、定义整体页面结构 从上述的效果展示图可以看出&#xff0c;页面的整体结构应该需要一个总菜单容器来装载父级菜单项&#xff0c;并且对应的父级菜单项应该有对应的菜单子项。子菜单是分类的话&#xff0c;我们还需要额外在扩展对应的容器来装…

mysql(由浅到深)

文章目录 1. 数据库分类与SQL分类2. SQL的数据类型3. DDL CURD3.1 库的操作3.2 表约束3.3 表的操作 4 DML CURD5. DQL &#xff08;数据查询语言&#xff09;5.1 单表查询5.2 聚合查询与分组查询5.3 多表查询与外键约束5.4 多表之间的连接查询5.4.1左链接查询5.4.2 右连接查询5…

FPGA图像处理仿真实验——均值滤波(FIFO)

之前的博客中用shift ram做的均值滤波&#xff0c;那篇文章里讲了原理&#xff0c;在这里不进行重复。考虑到shift ram的深度有限&#xff0c;在处理高分辨率图片时可能会收到限制&#xff0c;所以这次采用FIFO来进行均值滤波。FIFO可以看成是一个先进先出的堆栈&#xff0c;有…

TSINGSEE视频监控汇聚平台EasyCVR视频监控录像的3种方式

视频监控综合管理平台EasyCVR可以实现海量资源的接入、汇聚、计算、存储、处理等&#xff0c;平台具备轻量化接入能力&#xff0c;可支持多协议方式接入&#xff0c;包括主流标准协议GB28181、RTSP/Onvif、RTMP等&#xff0c;以及厂家私有协议与SDK接入&#xff0c;包括海康Eho…

UE5 关于MRQ渲染器参数

最佳参数&#xff1a; Spatial Sample Count&#xff1a;使用奇数样本时临时抗锯齿会收敛 Temporal Sample Count&#xff1a;超过2之后&#xff0c;采样过大会造成TAA效果不佳 TSR&#xff1a;UE5最好的抗锯齿方案

【C#】并行编程实战:使用 Visual Studio 调试任务

并行编程可以提高应用程序的性能&#xff0c;但是调试起来会更困难&#xff0c;这一点在之前的章节中我们已经有了很直观的感受。对于程序而言&#xff0c;保证程序的正确性和保证性能同样重要。 本章将介绍可以在 Visual Studio 中的调试工具&#xff08;包括 Thread 窗口、Ta…

C#winform中Icon图标获取方式

文章目录 图标来源格式转换 图标来源 阿里巴巴矢量图库 以“文件夹”图标为例&#xff1a; 格式转换 想要给winform的窗口添加一个图标&#xff0c;可以看到&#xff0c;需要添加.ico的格式。 将上面下载的图标通过wps的图片查看器打开&#xff1a; 点击左上角的属性&…

Docker 的数据管理和镜像的创建(Dockerfile)

目录 一&#xff1a;Docker 的数据管理 1&#xff0e;数据卷 2&#xff0e;数据卷容器 3.容器互联&#xff08;使用centos镜像&#xff09; 二&#xff1a;Docker 镜像的创建 1&#xff0e;基于现有镜像创建 &#xff08;1&#xff09;首先启动一个镜像&#xff0c;在容器里…

什么是AI和BI?

近日在冲浪时看到一个问题&#xff0c;说“AI和BI都有I&#xff0c;那这两个是一个东西吗&#xff1f;”&#xff0c;想要解答一下发现无从下口&#xff0c;这一下激起了我的“求知欲”&#xff0c;于是我找了一些资料后决定写下这篇文章&#xff0c;打算从几个方面为大家解答一…

生物信息学_玉泉路_课堂笔记_07 第七章 转录组学:基因芯片及RNA_sep数据分析

第七章 转录组学&#xff1a;基因芯片及RNA_sep数据分析 大部分是可以转录的 大概70-80%可Rna 从此区域出来的rna 来看 编码基因 只占据很小的一部分 2%左右 更多的区域转录出来的是非编码rna 转录组学的测序方法 基因芯片 RNA-sep 基因芯片只是了解思想 重点是RNA-sep…

Docker的数据卷、数据卷容器,容器互联

一、数据卷&#xff08;容器与宿主机之间数据共享&#xff09; 数据卷是一个供容器使用的特殊目录&#xff0c;位于容器中。可将宿主机的目录挂载到数据卷上&#xff0c;对数据卷的修改操作立刻可见&#xff0c;并且更新数据不会影响镜像&#xff0c;从而实现数据在宿主机与容…