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

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

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

引言

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

备忘录模式概述

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

核心角色解析

1. Originator(发起人)

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

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

2. Memento(备忘录)

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

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

3. Caretaker(管理者)

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

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

设计原则体现

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

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

C++实现示例

#include<iostream>#include<string>#include<vector>// 备忘录类classMemento{private: std::string state;// 只有Originator可以访问私有成员friendclassOriginator;Memento(const std::string& s):state(s){} std::string GetState()const{return state;}};// 发起人类classOriginator{private: std::string state;public:voidSetState(const std::string& s){ std::cout <<"设置状态: "<< s << std::endl; state = s;} Memento*CreateMemento(){returnnewMemento(state);}voidRestoreFromMemento(const Memento* m){ state = m->GetState(); std::cout <<"恢复状态: "<< state << std::endl;}};// 管理者类classCaretaker{private: std::vector<Memento*> mementos; Originator* originator;public:Caretaker(Originator* orig):originator(orig){}~Caretaker(){for(auto m : mementos)delete m;}voidSave(){ mementos.push_back(originator->CreateMemento());}voidUndo(){if(mementos.empty())return; Memento* m = mementos.back(); originator->RestoreFromMemento(m); mementos.pop_back();delete m;}};// 使用示例intmain(){ Originator originator; Caretaker caretaker(&originator); originator.SetState("状态1"); caretaker.Save(); originator.SetState("状态2"); caretaker.Save(); originator.SetState("状态3");// 执行撤销 caretaker.Undo();// 恢复到状态2 caretaker.Undo();// 恢复到状态1return0;}

典型应用场景

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

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

高级特性与优化

1. 增量备忘录

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

2. 序列化支持

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

3. 线程安全考虑

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

与其他模式的协作

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

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

注意事项

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

总结

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

Read more

微软BitNet开源:用Java在边缘设备部署7B级本地大模型(含ONNX Runtime优化)

微软BitNet开源:用Java在边缘设备部署7B级本地大模型(含ONNX Runtime优化)

文章目录 * 引言:当大模型开始"极简主义"生存 * 一、BitNet是啥?给大模型做"数字化减肥" * 1.1 1.58bit的魔法:三个数字走天下 * 1.2 为什么Java党这次能上桌吃饭 * 二、实战准备:把7B模型塞进边缘设备 * 2.1 硬件门槛:真不是越高越好 * 2.2 模型下载:别下错了版本 * 2.3 Java环境:ONNX Runtime是关键 * 三、核心代码:Java部署7B BitNet全实录 * 3.1 模型加载与初始化 * 3.2 推理Pipeline:分词、编码、解码

By Ne0inhk

VS Code中使用Git管理代码

以下内容由AI生成,亲测可用(除了最后的GitHub)。 可以把 Git 理解为一个 “超级后悔药” 或者 “时光机”。 为什么要用它? 你肯定有过这种经历:把代码文件名改成 code_v1.py, code_v2_final.py, code_v3_really_final.py… 最后自己都乱了。或者,你改了几行代码想优化算法,结果跑崩了,想改回去却忘了原来长什么样。 Git 就是为了解决这个问题。它能记录你每一次的修改,让你随时回退到过去的任何一个状态。 结合你的 WSL + VS Code 环境,我教你一套最直观、最少命令的“图形化”操作流程。 第一阶段:初次见面(配置身份) 在使用时光机之前,你得先告诉系统“是谁在使用它”,这样以后的记录才会显示是“你”

By Ne0inhk

计算机视觉新选择:阿里开源万物识别模型全面测评报告

计算机视觉新选择:阿里开源万物识别模型全面测评报告 核心结论先行:阿里最新开源的“万物识别-中文-通用领域”模型在中文语境下的图像理解能力表现出显著优势,尤其在细粒度物体识别、复杂场景解析和本地化部署效率方面超越主流英文预训练模型。本文基于真实环境部署与多维度测试,全面评估其性能表现、使用门槛与工程适用性。 一、背景与选型动因:为何需要中文优先的通用识别模型? 当前主流计算机视觉模型(如CLIP、YOLO系列、DINOv2等)大多以英文语料和西方场景数据为主进行训练,在面对中文环境下的实际业务需求时,常出现标签不匹配、语义理解偏差、文化特有物体识别失败等问题。例如,“糖葫芦”被识别为“水果串”,“共享单车”误判为“摩托车”。 在此背景下,阿里巴巴推出的万物识别-中文-通用领域模型应运而生。该模型专为中文用户设计,覆盖超过10万类中文标签,涵盖日常生活、工业制造、农业生态、城市治理等多个通用场景,支持零样本迁移(Zero-Shot Transfer),无需微调即可投入实际应用。 本次测评聚焦以下三个核心问题: - 模型在真实中文场景中的识别准确率如何? - 部署成本与推理效率

By Ne0inhk

Pencil Project完全指南:开源UI原型设计的效率革命

Pencil Project完全指南:开源UI原型设计的效率革命 【免费下载链接】pencilThe Pencil Project's unique mission is to build a free and opensource tool for making diagrams and GUI prototyping that everyone can use. 项目地址: https://gitcode.com/gh_mirrors/pe/pencil 在数字化产品设计领域,高效原型工具是连接创意与实现的关键桥梁。Pencil Project作为一款完全开源的原型设计工具,以其零成本门槛、跨平台兼容性和丰富的组件资源,正在重新定义UI/UX设计的工作流程。本文将从环境搭建到高级应用,全面解析这款工具如何帮助设计师从概念快速转化为可交互原型,释放创意潜能。 从零开始:Pencil

By Ne0inhk