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
相关推荐
blasit8 小时前
笔记:Qt C++建立子线程做一个socket TCP常连接通信
c++·qt·tcp/ip
七月丶13 小时前
别再手动凑 PR 了:这个 AI Skill 会按仓库习惯自动建分支、拆提交、提 PR
人工智能·设计模式·程序员
刀法如飞13 小时前
从程序员到架构师:6大编程范式全解析与实践对比
设计模式·系统架构·编程范式
九狼13 小时前
Flutter + Riverpod +MVI 架构下的现代状态管理
设计模式
静水流深_沧海一粟1 天前
04 | 别再写几十个参数的构造函数了——建造者模式
设计模式
StarkCoder1 天前
从UIKit到SwiftUI的迁移感悟:数据驱动的革命
设计模式
肆忆_1 天前
# 用 5 个问题学懂 C++ 虚函数(入门级)
c++
不想写代码的星星2 天前
虚函数表:C++ 多态背后的那个男人
c++
阿星AI工作室2 天前
给openclaw龙虾造了间像素办公室!实时看它写代码、摸鱼、修bug、写日报,太可爱了吧!
前端·人工智能·设计模式
_哆啦A梦2 天前
Vibe Coding 全栈专业名词清单|设计模式·基础篇(创建型+结构型核心名词)
前端·设计模式·vibecoding