《备忘录模式(极简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;
}
相关推荐
郭涤生1 分钟前
C++ 零拷贝(Zero-Copy)
linux·开发语言·c++
乐观勇敢坚强的老彭15 分钟前
计算机内存中的堆和栈
c++
John jj21 分钟前
拆解 Telegram 群组频道收录市场:三类方案,一个可运行的评分模型,目前TG中文人工评分加模型评分机制——LetsTG收录“快速”、“无门槛”
大数据·后端·python·深度学习·搜索引擎·django·全文检索
Boop_wu38 分钟前
SpringBoot 集成阿里云短信认证服务(个人)
spring boot·后端·阿里云
Gopher_HBo39 分钟前
Engine 核心(gin.go)
后端
用户1257585243644 分钟前
为什么队列长度归零,不代表后台异步任务真的跑完了
redis·后端·go
晚安code1 小时前
Java编程规范避坑指南:阿里开发手册15条强制规约实战解析
java·后端
间歇性努力持续性发呆的野生快乐选手1 小时前
dfs回溯,bfs枚举,完全背包
c++·算法·深度优先·宽度优先
小蒜学长2 小时前
“守望自然”招募志愿者环保行动网站的设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端
码工许师傅2 小时前
一文读懂《Effective C++ 第三版》的55条黄金法则
c++