《备忘录模式(极简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;
}
相关推荐
paopaokaka_luck5 分钟前
基于SpringBoot+Vue的少儿编程培训机构管理系(WebSocket及时通讯、协同过滤算法、Echarts图形化分析)
java·vue.js·spring boot·后端·spring
胖咕噜的稞达鸭19 分钟前
C++中的父继子承:继承方式实现栈及同名隐藏和函数重载的本质区别, 派生类的4个默认成员函数
java·c语言·开发语言·数据结构·c++·redis·算法
用户40993225021222 分钟前
PostgreSQL 查询慢?是不是忘了优化 GROUP BY、ORDER BY 和窗口函数?
后端·ai编程·trae
半夏知半秋24 分钟前
skynet.newservice接口分析
笔记·后端·学习·安全架构
笑口常开xpr27 分钟前
【C++】模板 - - - 泛型编程的魔法模具,一键生成各类代码
开发语言·数据结构·c++·算法
陈小桔39 分钟前
Springboot之常用注解
java·spring boot·后端
AA陈超1 小时前
虚幻引擎5 GAS开发俯视角RPG游戏 P05-01.创建游戏玩法标签
c++·游戏·ue5·游戏引擎·虚幻
数据知道1 小时前
Go基础:一文掌握Go语言泛型的使用
开发语言·后端·golang·go语言
笑口常开xpr1 小时前
【C++继承】深入浅出C++继承机制
开发语言·数据结构·c++·算法
rongqing20191 小时前
Google 智能体设计模式:学习和适应
设计模式