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

1、介绍

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

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

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

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

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

2、示例

#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;
}

结果:

角色当前状态:
体力:100 攻击力:100 防御力:100
角色当前状态:
体力:0 攻击力:0 防御力:0
角色当前状态:
体力:100 攻击力:100 防御力:100

相关推荐

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

    2024-07-10 09:42:04       23 阅读
  2. 突破编程_C++_设计模式备忘录模式

    2024-07-10 09:42:04       40 阅读
  3. C++ QT设计模式备忘录模式

    2024-07-10 09:42:04       34 阅读
  4. 设计模式-备忘录模式

    2024-07-10 09:42:04       58 阅读
  5. 设计模式——备忘录模式

    2024-07-10 09:42:04       56 阅读

最近更新

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

    2024-07-10 09:42:04       99 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-10 09:42:04       107 阅读
  3. 在Django里面运行非项目文件

    2024-07-10 09:42:04       90 阅读
  4. Python语言-面向对象

    2024-07-10 09:42:04       98 阅读

热门阅读

  1. WHAT - React useEffect 依赖的 Object.is

    2024-07-10 09:42:04       27 阅读
  2. 探索 Neo4j:图数据库的强大应用

    2024-07-10 09:42:04       35 阅读
  3. Llama-factory源码详细解读

    2024-07-10 09:42:04       23 阅读
  4. springBoot整合mongodb

    2024-07-10 09:42:04       22 阅读
  5. STM32 系统时钟初始化函数和延时函数

    2024-07-10 09:42:04       28 阅读