跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

C++ 备忘录模式:对象状态保存与恢复

备忘录模式允许在不破坏封装性的前提下捕获并外部化对象的内部状态。该模式解析了发起人、备忘录和管理者三个核心角色,展示了 C++ 中的具体代码实现,涵盖撤销操作、状态回滚及典型应用场景。内容包含设计原则体现、高级特性优化如增量备忘录与序列化支持,以及内存管理和线程安全等注意事项。

奇形怪状发布于 2026/3/24更新于 2026/6/2324 浏览
C++ 备忘录模式:对象状态保存与恢复

引言

在软件开发中,我们经常需要实现撤销操作、历史记录或状态回滚等功能。备忘录模式 (Memento Pattern) 正是为解决这类问题而生的设计模式。本文将深入探讨备忘录模式在 C++ 中的实现与应用,帮助开发者掌握这一强大的设计工具。

备忘录模式概述

备忘录模式是一种行为设计模式,它允许在不破坏封装性的前提下捕获并外部化一个对象的内部状态,以便以后可以将该对象恢复到原先保存的状态。该模式特别适合需要实现撤销操作、历史记录或快照功能的场景。

核心角色解析

1. Originator(发起人)

Originator 是需要保存状态的对象,它:

  • 负责创建备忘录并记录当前状态
  • 可以使用备忘录恢复之前的状态
  • 知道如何正确保存和恢复自身状态

2. Memento(备忘录)

Memento 是存储 Originator 状态的对象,特点包括:

  • 存储 Originator 的内部状态
  • 提供两个接口:宽接口 (Originator 使用) 和窄接口 (其他对象使用)
  • 确保状态的封装性不被破坏

3. Caretaker(管理者)

Caretaker 负责管理备忘录,其职责是:

  • 保存备忘录对象
  • 不操作备忘录内容
  • 只能通过窄接口与备忘录交互

设计原则体现

备忘录模式很好地体现了多个面向对象设计原则:

  1. 单一职责原则:将状态保存的职责从 Originator 中分离出来,使 Originator 可以专注于核心业务逻辑。
  2. 开闭原则:不需要修改 Originator 类就能扩展状态保存功能,通过新增备忘录类实现这一扩展。
  3. 迪米特法则:Caretaker 不直接操作 Memento 内部细节,有效降低了系统耦合度。

C++ 实现示例

#include <iostream>
#include <string>
#include <vector>

// 备忘录类
class Memento {
private:
    std::string state;
    // 只有 Originator 可以访问私有成员
    friend class Originator;
    Memento(const std::string& s) : state(s) {}
    std::string GetState() const { return state; }
};

// 发起人类
class Originator {
private:
    std::string state;
public:
    void SetState(const std::string& s) {
        std::cout << "设置状态:" << s << std::endl;
        state = s;
    }
    Memento* CreateMemento() {
        return new Memento(state);
    }
    void RestoreFromMemento(const Memento* m) {
        state = m->GetState();
        std::cout << "恢复状态:" << state << std::endl;
    }
};

// 管理者类
class Caretaker {
private:
    std::vector<Memento*> mementos;
    Originator* originator;
public:
    Caretaker(Originator* orig) : originator(orig) {}
    ~Caretaker() {
        for (auto m : mementos) delete m;
    }
    void Save() {
        mementos.push_back(originator->CreateMemento());
    }
    void Undo() {
        if (mementos.empty()) return;
        Memento* m = mementos.back();
        originator->RestoreFromMemento(m);
        mementos.pop_back();
        delete m;
    }
};

// 使用示例
int main() {
    Originator originator;
    Caretaker caretaker(&originator);
    originator.SetState("状态 1");
    caretaker.Save();
    originator.SetState("状态 2");
    caretaker.Save();
    originator.SetState("状态 3");
    // 执行撤销
    caretaker.Undo(); // 恢复到状态 2
    caretaker.Undo(); // 恢复到状态 1
    return 0;
}

典型应用场景

备忘录模式在以下场景中特别有用:

  1. 撤销/重做功能:如文本编辑器中的撤销操作
  2. 事务回滚系统:数据库操作的事务管理
  3. 游戏存档系统:保存和恢复游戏进度
  4. 配置管理:保存和恢复系统配置状态

高级特性与优化

1. 增量备忘录

对于状态变化不大的场景,可以只保存变化部分,这能显著减少内存消耗。

2. 序列化支持

通过序列化技术,可以将备忘录状态持久化存储,如保存到文件或数据库中。

3. 线程安全考虑

在多线程环境中使用时,需要添加适当的同步机制来保证状态的一致性。

与其他模式的协作

备忘录模式常与其他设计模式配合使用:

  1. 命令模式:实现可撤销的操作
  2. 原型模式:通过克隆对象状态来优化备忘录创建
  3. 状态模式:保存不同状态配置

注意事项

  1. 内存消耗:对于大对象状态,需考虑内存使用情况,可能影响系统性能
  2. C++ 内存管理:特别注意指针和内存泄漏问题
  3. 替代方案:原型模式有时可作为更简单的替代方案

总结

备忘录模式是面向对象设计原则的优秀实践,通过状态封装实现了灵活的回滚机制。合理使用该模式可以显著提高系统的可维护性和扩展性。在 C++ 中实现时,需要特别注意内存管理和线程安全等问题。掌握备忘录模式将帮助开发者构建更加强大、灵活的系统。

目录

  1. 引言
  2. 备忘录模式概述
  3. 核心角色解析
  4. 1. Originator(发起人)
  5. 2. Memento(备忘录)
  6. 3. Caretaker(管理者)
  7. 设计原则体现
  8. C++ 实现示例
  9. 典型应用场景
  10. 高级特性与优化
  11. 1. 增量备忘录
  12. 2. 序列化支持
  13. 3. 线程安全考虑
  14. 与其他模式的协作
  15. 注意事项
  16. 总结
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 华为昇腾 910B 上基于 LLaMA-Factory 微调 Qwen3.5-32B 的 LoRA 实战
  • OmniSteward:基于 LLM Agent 的智能家居与电脑控制助手
  • 在 Linux 服务器上部署 Codex AI IDE
  • Ubuntu 22.04 系统下 Tesla V100 双卡 NVIDIA 驱动与 CUDA 12.8 安装
  • Python 全栈开发学习路线与实战指南
  • C++ Qt 多线程 QThread 与线程安全锁 QMutex、QMutexLocker
  • C++ vector 容器底层原理与实战使用指南
  • C++ 基础:引用、inline 及 nullptr 用法
  • Claude Code 终端 AI 编程助手使用指南与功能详解
  • 使用 OLLAMA 国内镜像源加速本地大模型部署
  • 国内外免费 AI 平台盘点:零成本调用大模型 API
  • C#属性与C++成员变量:封装哲学与性能权衡的深度对比
  • Buzz 离线语音转文字工具安装及 Whisper 模型配置
  • 9 款提升效率的 PyCharm 实用插件推荐
  • Python 编程语言核心特性与入门实战指南
  • UZH RPG 组提出 AC-MPC:微分 MPC 赋能强化学习实现高速无人机竞速
  • Python 量化入门:使用 baostock 获取分钟级 K 线数据
  • XR 技术分享:三维实时渲染与 VR 全景视频的共生
  • 直流无刷电机 FOC 控制算法详解
  • 无人机辅助射频探测无线地下土壤健康监测智能钉平台

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online