C++设计模式---备忘录模式

1、介绍

备忘录模式是一种行为型设计模式,它允许在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后将对象恢复到原先保存的状态。

该模式主要涉及三个角色:

(1)发起人(Originator):这是需要保存和恢复状态的对象。发起人通常包含需要保存的状态数据,以及创建备忘录和从备忘录中恢复状态的方法。

(2)备忘录(Memento):用于存储发起人对象状态的对象。备忘录通常具有访问状态数据的方法,但不能直接修改状态。

(3)管理者(Caretaker):负责管理备忘录的对象。它可以保存多个备忘录对象,并提供对备忘录的访问,通常提供了保存和恢复状态的接口。

2、示例

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

// 备忘录类,用于存储游戏角色的状态
class RoleStateMemento {
private:
    int m_vit;  // 生命力
    int m_atk;  // 攻击力
    int m_def;  // 防御力

public:
    RoleStateMemento(int vit, int atk, int def) : m_vit(vit), m_atk(atk), m_def(def) {}

    // 设置生命力
    void setVitality(int vit) { m_vit = vit; }
    int getVitality() { return m_vit; }

    // 设置攻击力
    void setAttack(int atk) { m_atk = atk; }
    int getAttack() { return m_atk; }

    // 设置防御力
    void setDefense(int def) { m_def = def; }
    int getDefense() { return m_def; }
};

// 发起人,即游戏角色
class GameRole {
private:
    int m_vit;  // 生命力
    int m_atk;  // 攻击力
    int m_def;  // 防御力

public:
    // 保存角色状态,返回备忘录对象
    RoleStateMemento* saveState() {
        return new RoleStateMemento(m_vit, m_atk, m_def);
    }

    // 恢复角色状态,根据备忘录对象设置角色状态
    void recoverState(RoleStateMemento* memento) {
        m_vit = memento->getVitality();
        m_atk = memento->getAttack();
        m_def = memento->getDefense();
    }

    // 获取初始状态
    void getInitState() {
        m_atk = m_def = m_vit = 100;
    }

    void fight() {
        m_atk = m_def = m_vit = 0;
    }

    void stateDisplay() {
        std::cout << "角色当前状态:" << std::endl;
        std::cout << "体力:" << m_vit << " "
                  << "攻击力:" << m_atk << " "
                  << "防御力:" << m_def << std::endl;
    }
};

// 管理者,用于管理备忘录对象
class RoleStateCaretaker {
private:
    RoleStateMemento* m_memento;

public:
    ~RoleStateCaretaker() {
        delete m_memento;
    }

    void setMemento(RoleStateMemento* memento) {
        m_memento = memento;
    }

    RoleStateMemento* getMemento() {
        return m_memento;
    }
};

int main() {
    // 大战 boss 前
    GameRole* lixiaoyao = new GameRole;
    lixiaoyao->getInitState();
    lixiaoyao->stateDisplay();

    // 保存进度
    RoleStateCaretaker* stateAdmin = new RoleStateCaretaker;
    stateAdmin->setMemento(lixiaoyao->saveState());

    // 大战 boss 时,损耗严重
    lixiaoyao->fight();
    lixiaoyao->stateDisplay();

    // 恢复之前状态
    lixiaoyao->recoverState(stateAdmin->getMemento());
    lixiaoyao->stateDisplay();

    delete lixiaoyao;
    delete stateAdmin;

    return 0;
}

结果:

cpp 复制代码
角色当前状态:
体力:100 攻击力:100 防御力:100
角色当前状态:
体力:0 攻击力:0 防御力:0
角色当前状态:
体力:100 攻击力:100 防御力:100
相关推荐
汉克老师9 小时前
GESP2026年9月认证C++六级( 第三部分编程题(1、数组划分))精讲
c++·gesp·小学生·学c++编程
千里码aicood10 小时前
基于PLC与机器视觉的智能分拣控制系统设计
c++·自动化·plc
漂流瓶jz10 小时前
UVA-1442 洞穴 题解答案代码 算法竞赛入门经典第二版
c++·算法·题解·aoapc·算法竞赛入门经典·uva
朽棘不雕10 小时前
进一步了解模板
c++
汉克老师13 小时前
CSP-J 2026 初赛试题解析(第一部分:选择题(8-15))精讲
c++·csp-j·小学生·学c++编程
wabs66614 小时前
关于二叉树【力扣572.另一棵树的子树的思考】
数据结构·c++·算法·leetcode·二叉树
风合星语15 小时前
2026 ROS 2 Lyrical C++ 入门(五):Action 实战——任务反馈、取消与超时处理
c++·机器人·ros2·异步编程·lyrical
91刘仁德15 小时前
C++ 继承和多态 设计模式
c语言·c++·笔记
库玛西16 小时前
哈夫曼树与前缀编码:数据压缩的贪心核心
c语言·c++·笔记·考研
别动我齐刘海16 小时前
ROS2 Jazzy + C++ 实战路线——进阶学习3
c++·人工智能·vscode·python·算法·机器学习·机器人