新闻中心

C++怎么实现一个备忘录设计模式_C++行为型模式与状态保存恢复

2025-11-23
浏览次数:
返回列表
备忘录设计模式通过发起者、备忘录和管理者三者协作,实现对象状态的保存与恢复。发起者负责创建和恢复状态,备忘录封装状态数据并限制访问权限,管理者存储备忘录但不操作其内容。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 PictoGraphic

AI驱动的矢量插图库和插图生成平台

PictoGraphic 133 查看详情 PictoGraphic

它通常使用栈、列表等容器来存储历史状态,支持撤销、重做等功能。

示例代码片段:
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在线登录入口最新  豆包手机助手发布技术预览版:直接嵌入手机系统!努比亚样机发售  邮政快递包裹最新位置 邮政快递实时追踪入口  地铁跑酷免费秒玩入口链接 地铁跑酷小游戏免费秒玩网站 

搜索