0

0

C++怎么实现一个备忘录模式(Memento)_C++设计模式与备忘录模式实现

穿越時空

穿越時空

发布时间:2025-11-08 18:36:02

|

582人浏览过

|

来源于php中文网

原创

备忘录模式通过Originator创建Memento保存状态,Caretaker管理历史,实现状态回滚;C++中利用私有嵌套类确保封装性,配合栈结构支持撤销操作,需注意内存管理。

c++怎么实现一个备忘录模式(memento)_c++设计模式与备忘录模式实现

备忘录模式(Memento Pattern)是一种行为型设计模式,用于在不破坏封装性的前提下,保存和恢复对象的内部状态。C++中实现该模式的关键是将状态保存与对象本身分离,避免暴露私有成员。以下是清晰、实用的实现方式。

基本结构与角色说明

备忘录模式包含三个核心角色:

  • Originator(发起人):创建一个备忘录来保存当前状态,并能从备忘录中恢复状态。
  • Memento(备忘录):存储 Originator 的内部状态,通常只允许 Originator 访问其内容。
  • Caretaker(管理者):负责保存和提供备忘录,但不能访问或修改其内容。

使用私有嵌套类实现封装

为了保护内部状态不被外部访问,可将 Memento 定义为 Originator 的私有类,这样只有 Originator 能读取状态数据,Caretaker 只能持有而无法查看。

// 备忘录模式 C++ 实现示例 #include iostream> #include #include

class Originator { private: std::string state_;

// 私有备忘录类,仅 Originator 可访问其内容
class Memento {
public:
    explicit Memento(const std::string& s) : state_(s) {}
    std::string getState() const { return state_; }
private:
    std::string state_;
};

public: void setState(const std::string& state) { state_ = state; std::cout

std::string getState() const {
    return state_;
}

// 创建备忘录
Memento* saveToMemento() const {
    return new Memento(state_);
}

// 从备忘录恢复状态
void restoreFromMemento(Memento* memento) {
    if (memento) {
        state_ = memento-youjiankuohaophpcngetState();
        std::cout zuojiankuohaophpcnzuojiankuohaophpcn "State restored to: " zuojiankuohaophpcnzuojiankuohaophpcn state_ zuojiankuohaophpcnzuojiankuohaophpcn "\n";
    }
}

};

Teleporthq
Teleporthq

一体化AI网站生成器,能够快速设计和部署静态网站

下载

立即学习C++免费学习笔记(深入)”;

管理者管理多个历史状态

Caretaker 不解析 Memento 内容,只负责保存和传递。可以使用结构支持撤销操作。

class Caretaker { private: std::stack<:memento> history_;

public: ~Caretaker() { while (!history.empty()) { delete history.top(); history_.pop(); } }

void save(Originator* originator) {
    auto m = originator-youjiankuohaophpcnsaveToMemento();
    history_.push(m);
    std::cout zuojiankuohaophpcnzuojiankuohaophpcn "Saved state.\n";
}

void undo(Originator* originator) {
    if (history_.empty()) {
        std::cout zuojiankuohaophpcnzuojiankuohaophpcn "No state to undo.\n";
        return;
    }
    Originator::Memento* m = history_.top();
    history_.pop();
    originator-youjiankuohaophpcnrestoreFromMemento(m);
    delete m;  // 恢复后释放
}

};

立即学习C++免费学习笔记(深入)”;

使用示例与运行逻辑

下面是一个简单交互流程,演示如何保存和恢复状态。

int main() { Originator editor; Caretaker history;
editor.setState("First draft");
history.save(&editor);

editor.setState("Second draft");
history.save(&editor);

editor.setState("Final version");

// 撤销一次
history.undo(&editor);  // 回到第二版

// 再撤销一次
history.undo(&editor);  // 回到第一版

return 0;

}

输出结果:

State set to: First draft Saved state. State set to: Second draft Saved state. State set to: Final version Saved state. State restored to: Second draft State restored to: First draft

基本上就这些。通过私有嵌套类和指针管理,C++ 能有效实现安全的备忘录模式,既保持封装性,又支持灵活的状态回滚。注意内存管理,建议配合智能指针进一步优化资源安全。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

318

2023.08.02

while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

90

2023.09.25

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

525

2023.09.20

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

318

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

539

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

53

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

197

2025.08.29

javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

175

2023.11.23

Java JVM 原理与性能调优实战
Java JVM 原理与性能调优实战

本专题系统讲解 Java 虚拟机(JVM)的核心工作原理与性能调优方法,包括 JVM 内存结构、对象创建与回收流程、垃圾回收器(Serial、CMS、G1、ZGC)对比分析、常见内存泄漏与性能瓶颈排查,以及 JVM 参数调优与监控工具(jstat、jmap、jvisualvm)的实战使用。通过真实案例,帮助学习者掌握 Java 应用在生产环境中的性能分析与优化能力。

19

2026.01.20

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1.0万人学习

进程与SOCKET
进程与SOCKET

共6课时 | 0.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号