C++实现备忘录模式(Memento)

备忘录模式是一种设计模式,允许在不破坏封装性的前提下,捕获并保存对象的内部状态,以便恢复对象到先前保存的状态。文章介绍了备忘录模式的角色,例如Originator和Caretaker,并通过C++实现了一个游戏进度保存的例子,强调了备忘录模式中Caretaker维护的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是备忘录模式

在不破坏封装的情况下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。
在这里插入图片描述

角色

角色角色作用
Originator负责创建一个Mementor,用以记录当前时刻它的内部状态,并可使用备忘录恢复内部状态
Mementor负责存Originator对象的内部状态,并可防止Originator以外的对象方位备忘录
Caretaker负责保存好备忘录

实例来自《大话设计模式》,保存游戏进度

#include<iostream>
#include<vector>
using namespace std;

struct Mementor
{
private:
    int m_vitality;
    int m_attack;
    int m_defense;
public:
    int getvitality(){return m_vitality;}
    int getattack(){return m_attack;}
    int getdefense(){return m_defense;}
    Mementor(int vitality, int attack, int defense):m_vitality(vitality),m_attack(attack),m_defense(defense){}
    Mementor operator=(const Mementor& mementor)
    {
        this->m_attack = mementor.m_attack;
        this->m_defense = mementor.m_defense;
        this->m_vitality = mementor.m_vitality;
        return *this;

    }
};

struct Originator
{
private:
    int m_vitality;
    int m_attack;
    int m_defense;
public:
    Originator():m_vitality(100),m_attack(100),m_defense(100){}
    Mementor creatMementor() \\创建一个Mementor 对象
    {
        Mementor mementor(m_vitality, m_attack, m_defense);
        return mementor;
    }
    void Load(Mementor mementor)
    {
        this->m_attack = mementor.getattack();
        this->m_defense = mementor.getdefense();
        this->m_vitality = mementor.getvitality();
    }
    void showState()
    {
        cout << m_attack << m_vitality << m_defense << endl;
    }
    void attacked()
    {
        this->m_attack -=10;
        this->m_defense -=10;
        this->m_vitality -=10;
    }
};

struct Caretake \\管理备忘录
{
public:
    Caretake(){}
    void Save(Mementor menento) { m_vecMemento.push_back(menento); }
    Mementor Load(int state) { return m_vecMemento[state]; }
private:
    vector<Mementor> m_vecMemento;

};

int main()
{
    Originator orig1;
    orig1.showState();
    orig1.attacked();
    orig1.showState();
    Mementor mem = orig1.creatMementor();
    Caretake caretake;
    caretake.Save(mem);
    Originator orig2; \\新建游戏时,可以load备忘录
    orig2.showState();
    orig2.Load(caretake.Load(0));
    orig2.showState();

    return 0;
}

心得:
1.备忘录不一定要存Originator对象的所有状态,可以依据具体条件创建;
2.Caretake 的维护很关键,其实Mementor 只是一个过渡,最主要还是Caretake 和Originator的联系。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值