《备忘录模式(极简c++)》

本文章属于专栏- 概述 - 《设计模式(极简c++版)》-CSDN博客


模式说明:

  • 方案:备忘录模式用于捕获对象的内部状态,并在需要时将对象恢复到先前的状态。它包括三个关键角色:发起者(Originator)、备忘录(Memento)、管理者(Caretaker)。发起者负责创建备忘录,以便在以后能够恢复对象的状态。备忘录对象存储发起者的内部状态。管理者对象负责保存和获取备忘录。
  • 优点:允许对象在不破坏封装的情况下保存和恢复其内部状态。可以简化对象状态的管理,并提供了撤销操作的支持。
  • 缺点:可能会消耗较多的内存,尤其是当备忘录对象过多时。需要小心管理备忘录的生命周期,以避免内存泄漏。且频繁的内存拷贝也会导致CPU资源吃紧

本质思想:建立一个M类,可以由A类生产。A类也可以由M类还原。类似于,word写文章时,会自动保存中间状态,而这些中间状态,也可以完全恢复当时的文章。

实践建议:在低频且重要的逻辑中使用,因为此模式不仅费内存,也费CPU。

代码示例:

cpp 复制代码
#include <iostream>
#include <string>

// 备忘录类
class Memento {
public:
    Memento() = default; // 添加默认构造函数
    Memento(const std::string& state) : state_(state) {}
    std::string getState() const { return state_; }
private:
    std::string state_;
};

// 原始对象类
class Originator {
public:
    void setState(const std::string& state) { state_ = state; }
    std::string getState() const { return state_; }
    Memento createMemento() const { return Memento(state_); }
    void restoreMemento(const Memento& memento) { state_ = memento.getState(); }
private:
    std::string state_;
};

// 管理者类
class Caretaker {
public:
    Caretaker() = default; // 添加默认构造函数
    void setMemento(const Memento& memento) { memento_ = memento; }
    Memento getMemento() const { return memento_; }
private:
    Memento memento_;
};

int main() {
    // 创建原始对象
    Originator originator;
    originator.setState("State1");

    // 创建备忘录并保存状态
    Caretaker caretaker;
    caretaker.setMemento(originator.createMemento());

    // 修改原始对象的状态
    originator.setState("State2");

    // 恢复原始对象的状态
    originator.restoreMemento(caretaker.getMemento());

    // 输出恢复后的状态
    std::cout << "Restored state: " << originator.getState() << std::endl;
/*
输出:Restored state: State1
*/

    return 0;
}
相关推荐
IT_陈寒8 分钟前
Vite的静态资源路径搞得我头秃,原来这样配才对
前端·人工智能·后端
旖-旎12 分钟前
LeetCode 494:目标和(动态规划/01背包问题)—— 题解
c++·算法·leetcode·动态规划·01背包
小刘数字化38 分钟前
告别PPT:AR数据呈现如何重塑商业汇报体验
后端·restful
程序员爱钓鱼1 小时前
Rust match 模式匹配详解:比 if 更强大的条件分支
后端·rust
Java面试题总结1 小时前
Vue3流式调用大模型接口完整实践
后端·python
宠友信息1 小时前
从重复请求到订单同步看内容社区源码的处理思路
java·spring boot·redis·后端·mysql·spring
ysa0510301 小时前
【板子】德州扑克模拟
c++·笔记·板子
MobotStone1 小时前
五个AI使用习惯让你的效率翻倍
后端
pixcarp1 小时前
GMP调度模型和GC垃圾回收机制解析
后端·学习·golang·内存管理·gc·gmp
慧都小项1 小时前
C/C++ 静态分析为什么要前移?Parasoft C/C++test 在 IDE 与 CI/CD 中的应用
c语言·c++·ide·功能测试·ai