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
相关推荐
黑不溜秋的2 小时前
C++ 设计模式 - 策略模式
c++·设计模式·策略模式
付聪12104 小时前
策略模式介绍和代码示例
设计模式
Dream it possible!4 小时前
LeetCode 热题 100_在排序数组中查找元素的第一个和最后一个位置(65_34_中等_C++)(二分查找)(一次二分查找+挨个搜索;两次二分查找)
c++·算法·leetcode
柠石榴4 小时前
【练习】【回溯No.1】力扣 77. 组合
c++·算法·leetcode·回溯
王老师青少年编程4 小时前
【GESP C++八级考试考点详细解读】
数据结构·c++·算法·gesp·csp·信奥赛
ThereIsNoCode5 小时前
「软件设计模式」状态模式(State)
设计模式·状态模式
澄澈天空6 小时前
C++ MFC添加RichEditControl控件后,程序启动失败
c++·mfc
Lzc7746 小时前
C++初阶——简单实现vector
c++·简单实现vector
一个小白17 小时前
C++——list模拟实现
开发语言·c++
小猫猫猫◍˃ᵕ˂◍7 小时前
备忘录模式:快速恢复原始数据
android·java·备忘录模式