新闻中心
C++怎么实现一个备忘录设计模式_C++行为型模式与状态保存恢复
备忘录设计模式通过发起者、备忘录和管理者三者协作,实现对象状态的保存与恢复。发起者负责创建和恢复状态,备忘录封装状态数据并限制访问权限,管理者存储备忘录但不操作其内容。C++中可借助友元类和动态内存管理实现,结合智能指针可避免内存泄漏,适用于撤销、重做等场景。

备忘录设计模式(Memento Pattern)是一种行为型设计模式,用于在不破坏封装性的前提下,保存和恢复对象的内部状态。它特别适用于需要实现撤销操作、历史记录或状态快照的场景。C++中可以通过封装“发起者”、“备忘录”和“管理者”三个角色来实现这一模式。
发起者(Originator):管理自身状态
发起者是拥有内部状态的对象,它可以创建一个包含当前状态的备忘录,并能从备忘录中恢复状态。
关键点是状态的保存与恢复方法,通常包括:
- setState():设置当前状态
- createMemento():生成一个包含当前状态的备忘录对象
- restoreFromMemento():从备忘录中恢复状态
class Memento;
<p>class Originator {
private:
std::string state;
public:
void setState(const std::string& s) {
state = s;
}</p><pre class='brush:php;toolbar:false;'>std::string getState() const {
return state;
}
Memento* createMemento();
void restoreFromMemento(Memento* m);};
备忘录(Memento):封装状态数据
备忘录对象用来保存发起者的内部状态。为了维持封装性,备忘录对外只提供有限接口,通常仅允许发起者访问其内容。
常见做法是将发起者设为友元类,使其可读取私有状态,而外部只能通过管理者传递该对象。
示例代码片段:
class Memento {
private:
std::string state;
friend class Originator; // 允许Originator访问私有成员
<pre class='brush:php;toolbar:false;'>Memento(const std::string& s) : state(s) {}public: ~Memento() = default; };
Originator 中实现 createMemento 和 restoreFromMemento:
Memento* Originator::createMemento() {
return new Memento(state);
}
<p>void Originator::restoreFromMemento(Memento* m) {
if (m) {
this->state = m->state;
}
}</p>管理者(Caretaker):管理备忘录生命周期
管理者负责保存和管理多个备忘录对象,但它不能也不应直接访问备忘录中的状态数据。
PictoGraphic
AI驱动的矢量插图库和插图生成平台
133
查看详情
它通常使用栈、列表等容器来存储历史状态,支持撤销、重做等功能。
示例代码片段:
class Caretaker {
private:
std::vector<Memento*> mementos;
<p>public:
void addMemento(Memento* m) {
mementos.push_back(m);
}</p><pre class='brush:php;toolbar:false;'>Memento* getMemento(int index) {
if (index >= 0 && index < mementos.size()) {
return mementos[index];
}
return nullptr;
}
~Caretaker() {
for (auto m : mementos) {
delete m;
}
}};
实际使用示例
下面是一个简单
的使用流程,演示如何保存和恢复状态:
int main() {
Originator originator;
Caretaker caretaker;
<pre class='brush:php;toolbar:false;'>originator.setState("State1");
caretaker.addMemento(originator.createMemento());
originator.setState("State2");
caretaker.addMemento(originator.createMemento());
originator.setState("State3");
std::cout << "Current: " << originator.getState() << std::endl;
// 撤销到前一个状态
originator.restoreFromMemento(caretaker.getMemento(1));
std::cout << "After undo: " << originator.getState() << std::endl;
return 0;}
输出结果:
Current: State3 After undo: State2
基本上就这些。这个模式的核心在于解耦状态保存与业务逻辑,同时保护对象的封装性。在实际项目中,可以结合智能指针(如 std::unique_ptr)管理备忘录生命周期,避免内存泄漏。对于复杂状态,建议按需深拷贝关键字段,确保状态独立性。
以上就是C++怎么实现一个备忘录设计模式_C++行为型模式与状态保存恢复的详细内容,更多请关注其它相关文章!
# 多态
# seo原创度
# 地产营销推广服务合同范本
# 网站建设如何选
# 营销推广所属阶段
# 营销助手看不到推广记录
# seo网页怎么更新
# 视频网站推广公司排名
# 网站推广特出云速捷十年
# SEO绝对不要外包
# seo优化如何
# 多个
# 栈
# 是一种
# 这一
# 是一个
# 重做
# 如何实现
# 适用于
# 调试器
# 如何使用
# 封装性
# c++
# ai
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
Win10自动更新怎么关闭 Win10永久关闭系统更新的两种方法【终极版】
UE5.7引擎表现爆炸优化无敌!5090跑4K稳定60FPS
Win11怎么开启高性能模式_Windows 11电源计划优化设置
GemBox Document HTML转PDF垂直文本渲染问题及解决方案
MAC如何安全彻底地删除文件_MAC使用终端命令确保文件无法被恢复
Python中高效访问嵌套字典与列表中的键值对
UC浏览器网页版登录入口官网 电脑版网址入口
Python大型XML文件高效流式解析教程
纯CSS与HTML网格布局的HTML精简策略:SVG与JS方案解析
Win10双系统截图高效法 截屏快捷键速记【技巧】
J*a编写用户注册与登录功能_掌握字符串与验证逻辑
composer的"require-dev"部分是用来做什么的?
python3时间如何用calendar输出?
微信聊天记录怎么加密_微信聊天记录加密方法
没有大陆身份证/银行卡如何实名微信? 亲测有效的几种方法分享
Safari浏览器输入栏卡顿如何解决 Safari搜索建议与缓存清理
J*aScript类型检查_j*ascript代码规范
Golang如何实现微服务鉴权与权限控制_Golang微服务鉴权与权限管理实践
怎么在浏览器上运行HTML文件_浏览器运行HTML文件技巧【技巧】
React Router v6 教程:构建认证保护的私有路由与重定向策略
C++如何生成随机数_C++ random库使用方法与范围设置
Golang如何使用context实现超时取消_Golang context超时取消模式实践
Lar*el递归关系中排除子孙节点的策略
Golang如何使用net/url解析URL_Golang URL解析与处理方法
AO3最新入口2025公告_AO3中文官网合集
Golang如何通过reflect获取匿名字段方法_Golang reflect匿名字段方法访问技巧
俄罗斯浏览器官网直达链接 俄罗斯浏览器最新在线入口导航
蛙漫正版漫画平台入口_蛙漫免费阅读全站漫画资源
sublime如何处理大型CSV文件的列对齐_sublime高级表格编辑插件指南
Safari自带网页翻译功能怎么用 无需插件轻松看懂外文网站【方法】
C++的std::forward_list怎么用_C++ STL中单向链表容器的特点与应用
css链接悬停下划线样式如何自定义_使用::after结合content和transition
漫蛙2(台版)官方入口地址 漫蛙2(台版)正版漫画网页端
c++如何使用chrono库处理时间_c++标准库时间与日期操作
word中如何让数字纵向排列_Word数字纵向排列方法
押井守高度称赞《辐射4》:玩了八年都停不下来!
Yandex官网免登录入口_俄罗斯Yandex搜索引擎一键访问
Lar*el表单中优雅地处理“返回”按钮以规避验证:最佳实践指南
CSS布局:解决全屏元素100%尺寸与外边距导致的页面溢出问题
怎么在html里运行vbs脚本_html中运行vbs脚本方法【教程】
PyTorch模型训练效果不佳?深入剖析常见错误与调试技巧
sublime如何只显示或隐藏特定类型文件_sublime侧边栏文件过滤
windows10怎么关闭系统提示音_windows10彻底静音设置方法
C++的std::mdspan是什么_C++23中用于操作多维数组的非拥有视图
学习通在线学习平台 学习通网页版直接进入课程中心
夸克浏览器网页版最新地址 夸克浏览器官方入口合集
QQ官网正版登录链接 QQ在线登录入口最新
豆包手机助手发布技术预览版:直接嵌入手机系统!努比亚样机发售
邮政快递包裹最新位置 邮政快递实时追踪入口
地铁跑酷免费秒玩入口链接 地铁跑酷小游戏免费秒玩网站


2025-11-23
浏览次数:次
返回列表