c++之备忘录模式

设计模式C++实现(12)——备忘录模式 软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累。最近看设计模式的书,对于每个模式,用C++写了个小例子,加深一下理解。主要参考《大 阅读详情

备忘录模式

定义:捕获一个对象的内部状态,并在该对象之外保存这个状态。以后就可以将该对象恢复到之前被保存的状态。

UML类图:

以上
Originator是发起者,它负责创建一个备忘录Memento,记录当前时刻它的内部状态,并可使用备忘录Memento恢复内部状态。
Memento是备忘录,负责存储Originator对象的当前状态。
Caretaker是管理者,只负责保存备忘录Memento对象,但是不能对备忘录的内容进行任何操作。

场景模拟:

以前特别喜欢玩s11Pk版,有时候玩了一段时间,发现进展和预想的不一样,上将军邢道荣被敌方抓了,但又不想重新开始,于是重新读档,回到之前的状态,继续玩。

栗子代码:

其中
类图Originator对应San11PkPlayer.
Memento对应San11PkStorage.
Caretaker对应ManageSan11PkStorage.

#include <iostream>
#include <vector>
using namespace std;
class San11PkStorage;
 
//备忘录角色
class San11PkStorage{
public:
	San11PkStorage(std::string weather,vector<std::string> mapRoles)
	{
		this->m_weather = weather;
		this->m_inMaproles = mapRoles;
	}
 
 
//private:	//为了方便,这里直接用public
public:
	std::string m_weather;	//天气
	vector<std::string> m_inMaproles;	//在地图上的角色
	//...
};
 
//备忘录管理员角色
class ManageSan11PkStorage{
public:
	void setS11(San11PkStorage *s11)
	{
		m_s11 = s11;
	}
	San11PkStorage* getS11()
	{
		return m_s11;
	}
private:
	San11PkStorage *m_s11;
};
 
//发起人角色
class San11PkPlayer
{
public:
	//保存
	San11PkStorage* saveS11Status()
	{
		return new San11PkStorage(m_weather, m_inMaproles);
	}
 
	//恢复
	void recoveryS11Status(const San11PkStorage &s11s)
	{
		this->m_weather = s11s.m_weather;
		this->m_inMaproles = s11s.m_inMaproles;
	}
	//展示数据
	void showS11()
	{
		cout << "现在的季节是:" << m_weather.c_str() << endl;
		auto iter = m_inMaproles.begin();
		for (; iter != m_inMaproles.end(); iter++)
		{
			cout << "当前地图上的角色有:" << (*iter).c_str() << endl;
		}
	}
	//private:
public:
	std::string m_weather;	//天气
	vector<std::string> m_inMaproles;	//在地图上的角色
};
 
//客户端
int main()
{
 
	San11PkPlayer* pS11 = new San11PkPlayer;
 
	//现在的状态
	cout << "================开始玩游戏...===============" << endl;
	pS11->m_weather = "冬天";
	vector<std::string> vec;
	vec.push_back("张辽");
	vec.push_back("貂蝉");
	vec.push_back("邢道荣");
	pS11->m_inMaproles = vec;
	pS11->showS11();
 
 
	//保存当前状态
	ManageSan11PkStorage *manager = new ManageSan11PkStorage;
	manager->setS11(pS11->saveS11Status());	
 
	cout << "================玩了一段时间,不想玩了,读档再来===============" << endl;
	vec.at(0) = "张飞";
	vec.pop_back();
	pS11->m_inMaproles = vec;
	pS11->m_weather = "春天";
	pS11->showS11();
 
	cout << "================读档后===============" << endl;
	pS11->recoveryS11Status(*manager->getS11());
	pS11->showS11();
 
	if (manager)
	{
		delete manager;
		manager = nullptr;
	}
	if (pS11)
	{
		delete pS11;
		pS11 = nullptr;
	}
	return 0;
}

效果:

C++ 备忘录模式 备忘录模式(Memento Pattern)在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。 阅读详情

相关推荐

备忘录模式(Memento Pattern)的C++实现源代码

接下来,我们修改原始对象的状态,并将其恢复到之前保存的状态。最后,我们打印出恢复后的状态,以验证备忘录模式的正确性。备忘录模式是一种行为设计模式,它允许在不破坏封装性的情况下捕获和恢复对象的内部状态。通过使用备忘录模式,我们可以在不破坏封装性的情况下保存和恢复对象的状态,从而提供更好的灵活性和可维护性。类代表备忘录对象,它包含了原始对象的内部状态。类是原始对象类,它具有一个状态成员变量和与状态相关的操作。方法用于创建备忘录对象,将当前状态保存到备忘录中。类是管理者类,负责保存备忘录对象。

m0_47037246的博客 113

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

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

慢慢记录,慢慢更新。 2287

c++实现备忘录模式完整源代码

c++实现备忘录模式完整源代码Memento.hMemento.hCodeManager.hmain.cpp Memento.h #ifndef __MEMENTO_H__ #define __MEMENTO_H__ #include <string> using namespace std; class Memento { public: Memento(){} Memento(int iVersion, string iDate, string iLabel){ version

希望我的博客,能帮上你解决学习中工作中所遇到的问题 770

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

C++ 备忘录模式

伍粟的博客 3863

C++备忘录模式

在不破坏封装性的前提下,捕获一个对象的内部状态,这样以后就可将该对象恢复到原先保存的状态。并在该对象之外保存这个状态。

xiaobeibei2的博客 476

备忘录模式 C++ 实现

备忘录模式 C++ 实现

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

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

翟天保的博客 1万+

FPGA开发者必看:如何用SATA3.0主机控制器IP实现高速存储扩展(附Xilinx实测数据)

本文为FPGA开发者提供了基于SATA3.0主机控制器IP核的高速存储方案设计与优化指南。通过详细解析IP核架构、Xilinx FPGA平台集成实战及性能优化技巧,帮助开发者实现接近理论极限的540MB/s数据传输速度。文章还包含常见问题解决方案和高级应用场景拓展,是硬件工程师提升存储性能的必备参考。

weixin_30632089的博客 114

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

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

不负AC不负卿的博客 1212

python123题目——摩尔斯电码转换

类型:列表元组。

m0_62488776的博客 4415

RK3588网络调试笔记:当我把默认RTL8211F PHY换成另一款时,踩了哪些坑?

本文详细记录了在RK3588平台上将默认RTL8211F PHY芯片替换为其他型号的全过程,包括硬件设计验证、内核驱动适配、复位时序配置等关键步骤。通过实际案例分享,提供了从驱动调试到硬件优化的系统性解决方案,帮助开发者高效完成PHY芯片替换,确保网络接口稳定性。

weixin_30291791的博客 669

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

备忘录模式

m0_60259116的博客 367

Linux内核支持串口屏,linux串口触摸屏设计总结

Linux serial touch 设计总结概述:最近在做嵌入式linux下串口触摸屏设计,遇到一些问题,经过查找资料和请教同事,总算把问题解决了,事后有把linux相关的内核代码仔细看了一遍,为了有点成果,特别写了个总结。如有任何问题请联系yxj_5421@http://www.doczj.com/doc/87b94b1e227916888486d76d.html,转载请标明出处。系统资源:L...

weixin_39935903的博客 1296

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

C++设计模式——备忘录模式(Memento Pattern) 微信公众号:幼儿园的学霸 目录 文章目录C++设计模式——备忘录模式(Memento Pattern)目录定义代码示例总结参考资料 定义 Without violating encapsulation, capture and externalize an object’s internal state so that the object can be restored to this state later 在不破坏封装性的前提下,捕

leonardohaig的博客 1006

PDAF相位对焦原理

pdaf光路图

camerall 1万+

【Matlab】matlab代码实现迭代学习控制

该文介绍了在Matlab中实现迭代学习控制(ILC)的方法。ILC通过利用历史轨迹数据来优化重复任务的控制性能。文章提供了一个步进电机控制示例,包括:1)定义正弦轨迹;2)设置100次迭代和0.1学习率;3)建立二阶系统模型;4)执行ILC算法计算控制输入;5)绘制期望轨迹与实际输出的对比图。该示例展示了ILC的基本实现过程,并指出实际应用可能需要更复杂的设计。代码演示了误差计算、控制输入更新和结果可视化等关键步骤。

unber的博客 200

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

对于每个 "Increment" 和 "Decrement" 操作,输出当前计数器的值,计数器数值从0开始 对于每个 "Undo" 操作,输出撤销后的计数器值。输入包含若干行,每行包含一个字符串,表示计数器应用的操作,操作包括 "Increment"、 "Decrement"、"Undo" 和 "Redo"。备忘录有两个接⼝,发起⼈能够通过宽接⼝访问数据,管理者只能看到窄接⼝,并将备忘录传递给其他对象。UndoManager 和UndoableEdit 接⼝是与备忘录模式相关的主要类和接⼝。

K1_uestc的博客 2184

商用车重型多挡位机械式变速器(AMT)结构设计与仿真分析

本文针对商用车重型AMT变速器开展结构设计与仿真分析。设计采用12挡双中间轴结构,匹配400kW柴油发动机,最大扭矩2000Nm。通过等比级数分配传动比(头挡14.5,最高挡0.78),采用主副箱组合实现多挡位。双中间轴结构可抵消径向力,提升承载能力。关键设计包括:235mm中心距、4.5-5.0mm齿轮模数、锁环式同步器和复合润滑系统。通过Python参数化建模进行强度校核,计算显示中间轴在2000Nm工况下等效应力满足安全系数要求(屈服强度850MPa,安全系数≥2)。该设计解决了传统MT变速器操作强度

AI的内部世界的博客 113

(三)行为模式:6、备忘录模式(Memento Pattern)(C++示例)

介绍备忘录模式的含义,应用场景,优缺点,以及C++实现的实例。

bigger_belief的博客 735

利用人工神经网络在Abaqus中实现本构模型的网格粗化计算框架:详细指南与实践

在这篇文章中,我们详细介绍了如何在Abaqus中实现基于人工神经网络(ANN)的本构模型以进行网格粗化的计算框架。我们通过两个主要模块——数据生成器模块和ANN训练模块,实现了这一计算框架,并将训练好的ANN集成到Abaqus的用户材料子程序(UMAT)中,创建了一个基于ANN的本构模型。我希望这篇文章能帮助到那些希望在Abaqus中实现基于ANN的本构模型的读者,同时,我也非常欢迎大家提出宝贵的意见和建议,让我们共同进步。

qq_38334677的博客 1714

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

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

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

净无邪博客 1482

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

【C++】备忘录模式

备忘录模式(Memento Pattern)是一种【行为型】设计模式,它允许在不破坏对象封装性的前提下,捕获并保存对象的内部状态,以便后续可以将对象恢复到先前的状态。这种模式通过将状态保存和恢复操作分离,实现了对象状态管理的职责分离。

AAADiao的博客 1346

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

备忘录模式及C++实现

一,理论学习: 1.什么是备忘录模式?     GoF《设计模式》中对备忘录模式的定义是这样的:在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样就可以将该对象恢复到原先保存的状态!      世界上本没有后悔药,但是我们在进行软件系统设计的时候要给用户后悔的权利,提供用户后悔药!备忘录模式顾名思义就是将一个对象某个时候的状态备个份,当用户后面需要返回这个状态时就

u012395430的专栏 1478

cpp: Memento Pattern

【代码】cpp: Memento Pattern。

Geovin Du Dream Park 214

突破编程_C++_设计模式(备忘录模式)

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

突破编程 1436

(C++实现)——备忘录模式(Memento Pattern)

概述:     我们玩单机游戏的时候总会遇到老婆大人的各位事情,一会去买瓶醋了,一会去打个酱油了,会耽误我们玩游戏的进程,但是此时我们能有“保存游戏”这个宝贝,我们的主基地不会在我们打酱油的时候被对手拆掉。     这“保存游戏”的功能其实就是备忘录模式的很好应用,她是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以就该对象恢复到原先保存的状态。

晴天的专栏 1011
上一篇: c++之原型模式
下一篇: c++之适配器模式
Qt上位机开发
Qt上位机开发 领域专家: C/C++技术领域 领域专家: C/C++技术领域
博客等级 码龄9年 9664粉丝 178原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值