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

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


模式说明

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

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

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

代码示例

#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++)》

    2024-04-05 09:32:03       38 阅读
  2. 模版模式c++)》

    2024-04-05 09:32:03       34 阅读
  3. 《工厂模式c++)》

    2024-04-05 09:32:03       43 阅读
  4. 《原型模式c++)》

    2024-04-05 09:32:03       57 阅读
  5. 《过滤器模式c++)》

    2024-04-05 09:32:03       46 阅读
  6. 《适配器模式c++)》

    2024-04-05 09:32:03       45 阅读
  7. 《组合模式c++)》

    2024-04-05 09:32:03       42 阅读
  8. 《外观模式c++)》

    2024-04-05 09:32:03       38 阅读
  9. 《命令模式c++)》

    2024-04-05 09:32:03       33 阅读
  10. 《状态模式c++)》

    2024-04-05 09:32:03       152 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-05 09:32:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-05 09:32:03       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-05 09:32:03       87 阅读
  4. Python语言-面向对象

    2024-04-05 09:32:03       96 阅读

热门阅读

  1. Linux命令——用户管理和组管理

    2024-04-05 09:32:03       31 阅读
  2. Spring Boot 启动扩展点深入解析

    2024-04-05 09:32:03       38 阅读
  3. 算法基本概念

    2024-04-05 09:32:03       32 阅读
  4. go并发请求url

    2024-04-05 09:32:03       33 阅读
  5. SpringAI如何集成Ollama开发AI应用

    2024-04-05 09:32:03       37 阅读
  6. react组件:profiler

    2024-04-05 09:32:03       28 阅读
  7. flutter项目ffi相关

    2024-04-05 09:32:03       37 阅读