我所理解的设计模式(C++实现)——备忘录模式(Memento Pattern)

C++备忘录模式实战:封装对象状态实现撤销与恢复 在面向对象编程中,对象封装是核心原则之一,它要求隐藏内部状态并仅通过公共接口进行交互。然而,在需要实现撤销、重做或状态回滚等功能时,直接暴露对象内部数据会破坏封装性。备忘录模式通过引入三个核心角色——原发器、备忘录和负责人,将状态保存与恢复的职责分离。原发器负责创建和解读状态快照,备忘录作为黑盒存储状态数据,负责人则管理历史记录。这种设计不仅维护了封装性,还提升了代码的可维护性和健壮性。在C++实现中,需特别注意深拷贝与浅拷贝、内存管理以及利用友元或嵌套类进行访问控制。该模式广泛应用于图形编辑器、游戏存档、 阅读详情

概述:

    我们玩单机游戏的时候总会遇到老婆大人的各位事情,一会去买瓶醋了,一会去打个酱油了,会耽误我们玩游戏的进程,但是此时我们能有“保存游戏”这个宝贝,我们的主基地不会在我们打酱油的时候被对手拆掉。

    这“保存游戏”的功能其实就是备忘录模式的很好应用,她是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以就该对象恢复到原先保存的状态。这个其实也是我们的redo,undo所采用的模式。

类图和实例:


简单的模式实例:
#include <iostream>
#include <string>
using namespace std;
class Memento {
private:
    string state;


public:
    Memento()
    {
        state = "";
    }
    Memento(string state){
        this->state = state;
    }
    string getState() {
        return state;
    }
    void setState(string state) {
        this->state = state;
    }
};


class Originator {
private :
    string state;


public:
    Originator()
    {
        state = "";
    }


    string getState() {
        return state;
    }
    void setState(string state) {
        this->state = state;
    }
    Memento createMemento(){
        return Memento(this->state);
    }
    void restoreMemento(Memento memento){
        this->setState(memento.getState());
    }
};




class Caretaker {
private :
    Memento memento;
public :
    Memento getMemento(){
        return memento;
    }
    void setMemento(Memento memento){
        this->memento = memento;
    }
};
int main (int argc, char *argv[])   
{
    Originator originator;
    originator.setState("状态1");
    cout<<"初始状态:"<<originator.getState()<<endl;
    Caretaker caretaker;
    caretaker.setMemento(originator.createMemento());
    originator.setState("状态2");
    cout<<"改变后状态:"<<originator.getState()<<endl;
    originator.restoreMemento(caretaker.getMemento());
    cout<<"恢复后状态:"<<originator.getState()<<endl;
}

适用性:

适用于功能比较复杂的,但需要记录或维护属性历史的类;或者需要保存的属性只是众多属性中的一小部分时Originator可以根据保存的Memo还原到前一状态。 

优缺点:

优点:

1)当发起人角色的状态有改变时,有可能是个错误的改变,我们使用备忘录模式就可以把这个错误改变还原。

2)备份的状态是保存在发起人角色之外的,这样,发起人角色就不需要对各个备份的状态进行管理。

缺点:

1)如果备份的对象存在大量的信息或者创建、恢复操作非常频繁,则可能造成很大的性能开销。



LCL_data原创于youkuaiyun.com【http://blog.youkuaiyun.com/lcl_data/article/details/9745019】

其他设计模式文章请参考:我所理解的设计模式

备忘录模式:对象状态快照与撤销重做的设计模式实践 在软件工程中,对象状态的保存与恢复是构建可靠系统的核心需求之一,其原理在于通过封装技术捕获对象内部状态并在外部存储,实现历史状态的追踪与回溯。这一机制的技术价值在于保障了封装性原则,实现了职责分离,为复杂状态管理提供了标准化方案。其典型应用场景包括文本编辑器的撤销重做、游戏进度存档、事务回滚以及浏览器历史记录等需要状态版本控制的领域。备忘录模式作为实现该机制的行为型设计模式,通过发起人、备忘录和负责人三个核心角色的协作,解决了状态历史记录问题,其中深拷贝与浅拷贝的选择、内存消耗与性能权衡是工程实践中的关键考 阅读详情

相关推荐

备忘录模式(Memento Pattern)在软件设计模式中扮演着重要的角色

它是一种行为型模式,用于在不破坏封装性的情况下捕获和存储对象的内部状态,并在需要时将其恢复。原发者是要保存状态的对象,备忘录是保存状态的数据结构,而管理者负责存储和恢复备忘录。”,但随后通过恢复操作将其恢复到了之前保存的状态。最后,我们输出恢复后的文本,验证恢复操作是否成功。通过备忘录模式,我们可以轻松地实现对象状态的保存和恢复,同时保持了对象的封装性。我们希望能够在撤销操作之前保存编辑器的状态,以便在需要时恢复。通过这些类的协作,我们可以轻松地实现对象状态的保存和恢复功能。,它具有保存和恢复状态的功能。

RiqaEditor的博客 110

设计模式——Memento(备忘录)模式

目录前言1 定义2 适用情况3 结构3.1 结构图3.2 参与者4 应用举例4.1 Memento和MementoCare4.2 Orginator——UrlEntity4.3 Client——ClientTest5 总结参考文献 前言 有时有必要记录一个对象的内部状态,以方便用户从错误中恢复过来。比如访问浏览器要求实现后退和撤销功能等。 1 定义 Memento(备忘录)模式:在不破坏封装性前提下,获取对象内部状态并外部保存,以方便日后恢复对象状态。 2 适用情况 当需要保存一个对象的内部状态,以方便后

qq_36566262的博客 1786

【信息科学与工程学】计算机科学与自动化——第一百六十八篇 软件设计方法/模式06

编号软件类型设计方法/模式所属层解决的核心问题典型实现适用场景优点风险/注意2701数据治理主数据管理 (Master Data Management, MDM)数据治理层统一管理企业核心业务实体的单一可信版本实践:建立MDM平台,整合来自多个系统的客户、产品、供应商等主数据,通过匹配、合并、去重生成黄金记录。大型企业多系统环境。① 数据一致性;② 提升业务效率;③ 支撑分析。① 实施周期长;② 组织协调难;③ 数据质量要求高。2702数据治理主数据治理委员会 (MDM Governance Board)数

weixin_49199313的博客 173

C++设计模式(17)——备忘录模式

C++ 备忘录模式

伍粟的博客 3863

【天线与电波传播】电波传播部分 第7章 电波传播的基础知识3

菲涅尔区与菲涅尔带的基本知识

Chen59_2328的博客 1600

手把手教你解锁TI MSPM0G3507开发板(2025新版,附XDS110接线图)

本文详细解析了2025版TI MSPM0G3507开发板的解锁方法,针对新版硬件中BSL引脚的电路设计变化提供了精准接线方案和UniFlash软件配置步骤。通过实测数据和专业指导,帮助开发者解决芯片锁定问题,确保调试接口正常响应。

weixin_42696271的博客 807

C++ 设计模式——备忘录模式

备忘录(Memento)模式也称为快照(Snapshot)模式,是一种行为型模式,主要用于防止数据丢失。它通过对对象的状态进行备份,以便在未来需要时可以恢复这些数据。换句话说,该模式能够将某个时间点的对象内部状态保存下来,并在必要时根据保存的内容将该对象恢复到当时的状态。备忘录模式的结构比较简单,使用频率相对较低,但在特定场景下非常有用。

慢慢记录,慢慢更新。 2287

基于SHIS凝视型短波红外高光谱相机(900-1700nm)区分不同宝石的差异性和可分性(宝石分选)

SHIS系列凝视型高光谱相机基于液晶可调谐滤波器(LCTF),通过电控LCTF进行连续细分窄波段分光,对每个波段进行高分辨率的二维面阵成像,进行图像处理后,获得完整的高光谱高清图像序列。具有低功耗、小型化、使用方便和易于扩展的优势。其工作波段覆盖400nm至1000nm,能够捕捉宝石在不同波长下的光谱特征,为宝石鉴定提供了新的工具。

wayho的博客 707

【Memento模式】C++设计模式——备忘录模式

C++备忘录模式,Memento模式,本文以编辑器的例子引入备忘录模式的讲解,同时展示了其类图结构,最后加以分析备忘录模式在当今时代的运用。

不负AC不负卿的博客 1211

计算机组成原理实验logisim(四)之运算器实验

注意,上半张图中所有连入32位宽多路选择器的器件和的“数据位宽”都是32,而中间部分连入1位多路选择器的器件的“数据位宽”皆为1(除了连向“32位加法器”的那一个非门,是32位)。第二到第五个实验的测试,具体怎么测试好吧我也不太清楚,听室友说就是让你分析各种亮灯的原理,比如你点这个,那个为什么颜色要变等等,我就不粘图了,恩大家加油。连图如下,需要在连线之前格外注意“异或门”和“与门”的位宽,将16改为1,不然数据无法通行。关于学术问题,为何这样连什么的,就别问我了,我也没有搞的那么透彻。

qq_54422132的博客 2万+

从Level 1到Level 22:手把手带你用Burp Suite通关burp-labs靶场全关卡(附难点解析)

本文详细解析了如何使用Burp Suite通关burp-labs靶场的22个关卡,从基础爆破到复杂编码绕过,涵盖Intruder配置、响应过滤、POST请求处理、MD5爆破等关键技术。特别针对Level 16的三重编码和Level 20的中文响应处理等难点提供实战技巧,帮助渗透测试工程师提升Web安全实战能力。

weixin_28831461的博客 432

设计模式之备忘录模式(C++)

介绍设计模式之备忘录模式

翟天保的博客 1万+

SAP S/4HANA 中 RAP 业务对象接口的消费模式

本文探讨了SAP S/4HANA中RAP业务对象接口的消费模式,重点介绍了通过EML直接调用和CDS投影两种Clean Core开发路径。文章分析了BO Interface作为稳定契约的价值,并提供了BAdI集成、OData服务发布等实际场景案例,同时对比了OData V2/V4的技术选型考量,最后强调了ADT向导使用中的DCL权限注意事项。全文旨在帮助开发者构建升级友好的业务对象消费方案。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 757

C++设计模式——备忘录模式(memento pattern)

博主看了许多文章和一些书,发现要么代码不全,要么对备忘录的理解有偏差,要么干脆根本就不是备忘录模式,经过博主查阅十余篇文章和详细研究书本备忘录模式,总结出这篇精华的c++备忘录模式文章,感兴趣的朋友可以阅读和提出建议。 # 一、原理讲解 别名Token。 ## 1.1意图 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。

净无邪博客 1482

【Unity】NGUI下载与导入

Unity3D插件NGUI的下载和导入。

Get your hands dirty 3万+

反应堆设计:基于MATLAB的反应堆仿真和分析,包括反应堆稳态分析、反应堆动态分析和反应堆安全分析 介绍

反应堆设计是利用计算机技术对核反应堆进行设计和模拟,以获得安全、高效、经济的核能发电系统。它是核能领域的重要组成部分,在电力生产、核医学、科学研究等领域有着广泛的应用。

走向CTO的路上... 1112

【c++设计模式20】行为模式5:备忘录模式(Memento Pattern)

备忘录模式(Memento Pattern)是一种行为型设计模式,它通过捕获一个对象的内部状态,并在该对象之外保存这个状态,从而在需要时可以将该对象恢复到原先保存的状态。备忘录模式实现了在不破坏封装性的前提下,对对象的状态进行备份和恢复。

junxuezheng的博客 543

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

设计模式每日硬核训练 Day 18:备忘录模式(Memento Pattern)完整讲解与实战应用

本文详细讲解了备忘录模式(Memento Pattern)的设计与应用。该模式在不破坏封装的前提下保存对象内部状态,支持状态回滚。文章通过文本编辑器撤销操作实例,展示了备忘录模式的UML结构和C++实现,包含Originator、Memento、Caretaker三个核心角色。对比了备忘录模式与原型模式的区别,并解答了面试常见问题。最后提供了两个练习题:文本状态保存器和图形编辑器撤销操作,帮助读者深入理解该模式的实际应用场景。该模式适用于需要撤销/恢复功能的场景,如文档编辑、游戏存档等。

Interview_TC的博客 822

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

C++ 备忘录模式与访问者模式详解:DesignPatterns 项目中对象状态快照与双分派技巧的完整实现

本文基于开源的 **DesignPatterns** 项目——一套 C++ 设计模式趣味教程——带你完整看懂两个经典行为型模式:**备忘录模式**(对象状态快照与"时光倒流"恢复)和**访问者模式**(双分派技巧,不改老代码就能加新行为)。新手照着读,10 分钟即可掌握 C++ 备忘录模式与访问者模式的核心实现思路。 ## 🚀 快速上手:DesignPatterns 项目怎么跑 Design

gitblog_00249的博客 362

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

我与C++设计模式(十六)——memento模式

这个模式通常被翻译为备忘录模式,我并不是很欣赏这个翻译,b

guozhengdong的专栏 815

备忘录模式:实现撤销/重做与状态恢复的设计模式详解

在软件设计中,设计模式是解决常见问题的可复用方案。行为型设计模式关注对象间的职责分配与通信机制,其中备忘录模式(Memento Pattern)提供了一种在不破坏封装性的前提下捕获和外部化对象内部状态的方法。其核心原理是通过分离状态保存与恢复的职责,由发起人(Originator)创建状态快照(备忘录),管理者(Caretaker)负责存储,从而实现状态回溯。该模式的技术价值在于为系统赋予“撤销/重做”和“状态恢复”能力,显著提升用户体验与系统健壮性。其典型应用场景包括文本编辑器的撤销功能、游戏存档/读档、

weixin_34198453的博客 416

[行为型模式] 备忘录模式的理解

[img]https://api5.yunpan.360.cn/intf.php?method=Share.getPublicThumbByNid&qid=108635719&nid=13770720612900431&size=800_600&devtype=web&v=1.0.1&rtick=14676146429127&share_qid=108635719&sign=35a231a5a11...

Jacky_Dai的专栏 210

React组件就是对象?react-design-patterns核心思想全解析:Hooks时代设计模式为何依然有效

**react-design-patterns** 是一个把经典面向对象设计模式应用到 React 的研究项目,核心思想一句话就能说清:**React 组件就是对象**。组件有状态(state)、有行为(事件回调)、有接口(props),这和面向对象语言里的对象一模一样。搞清楚这一点,你会发现单例、桥接、工厂这些"老古董"模式,在 Hooks 时代不但没有过时,反而更加好用。👇 ## 核心思想

gitblog_01117的博客 420

C++命令模式实战:从解耦到实现撤销重做的文本编辑器

在软件工程中,设计模式是解决常见设计问题的经典方案,其中命令模式(Command Pattern)是一种行为型模式,它将请求封装为独立的对象,从而实现对请求的参数化、队列化与日志化。其核心原理是将“调用者”与“接收者”解耦,通过一个抽象命令接口统一操作,使得请求的发起者无需知道具体执行细节。这一模式的技术价值在于,它将操作提升为一等公民对象,便于实现复杂的控制流,如任务调度、事务管理和历史记录。在应用场景上,命令模式广泛应用于GUI事件处理、异步任务队列以及需要支持撤销(Undo)和重做(Redo)功能的系

weixin_33709364的博客 481

JAVA面试题(1~95)《上》

1、面向对象的特征有哪些方面?  答:面向对象的特征主要有以下几个方面:  - 抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。  - 继承:继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类(超类、基类);得到继承信息的类被称为子类(派生类)。继承让变化中的软件系统有了一定的延续性...

ywl470812087的博客 4963
上一篇: 我所理解的设计模式(C++实现)——中介者模式(Mediator Pattern)
下一篇: 我所理解的设计模式(C++实现)——状态模式(State Pattern)
十八道胡同
博客等级 码龄20年 848粉丝 109原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值