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
相关推荐
yuanyuan2o21 小时前
从最小项目开始的 CMake 教程
c语言·开发语言·arm开发·c++·makefile·make·cmake
xh didida3 小时前
算法 -- 位运算
开发语言·c++·算法
hele_two3 小时前
VS Code + CMake 调用 SDL2 & SDL2_image 完整编译教程(Windows 平台)
c++·windows·vscode·图形渲染
量子炒饭大师4 小时前
【优化算法】双指针算法的「义体化」重构 ——【双指针】双指针算法中的指针是如何定义的?如何使用它进行一些简单的算法?
c++·算法·重构·优化算法·双指针
身如柳絮随风扬4 小时前
MyBatis 与 Spring 中的设计模式
spring·设计模式·mybatis
小辉同志4 小时前
62. 不同路径
c++·力扣·多维动态规划
arron88994 小时前
DebugView未打印日志原因
c++
hele_two4 小时前
SDL2高效画实心圆的算法(一)
c++·算法·图形渲染
AbandonForce6 小时前
哈希表(HashTable,散列表)个人理解
开发语言·数据结构·c++·散列表
样例过了就是过了6 小时前
LeetCode热题100 编辑距离
数据结构·c++·算法·leetcode·动态规划