《备忘录模式(极简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;
}
相关推荐
码事漫谈3 分钟前
Vibe Coding时代:人人都是开发者
后端
2501_916766545 分钟前
【Spring框架】SpringJDBC
java·后端·spring
+VX:Fegn089517 分钟前
计算机毕业设计|基于springboot + vue图书管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
AntBlack17 分钟前
忍不住推荐 : AI 时代 ,桌面端真的可以考虑一下Go+Wails 的组合
后端·go·ai编程
cooldream200918 分钟前
当代 C++ 的三大技术支柱:资源管理、泛型编程与模块化体系的成熟演进
开发语言·c++
码事漫谈23 分钟前
C++20协程如何撕开异步编程的牢笼
后端
Queenie_Charlie39 分钟前
数字去重(set)
数据结构·c++·set
DevYK1 小时前
Coze Studio 二次开发(二)支持 MCP Server 动态配置
后端·agent·coze
掘金码甲哥1 小时前
在调度的花园里面挖呀挖
后端
Ayanami_Reii1 小时前
区间不同数的个数-树状数组/线段树/莫队/主席树
数据结构·c++·算法·线段树·树状数组·主席树·莫队