设计模式 BY C++C++设计模式

C++ 设计模式 —— 18.备忘录模式

2019-12-29  本文已影响0人  JeremyYv

以下是备忘录模式的简单代码实现
#include <iostream>
#include <string>
#include <vector>
using namespace std;

//单条备忘的记录
class Memento
{
public:
    Memento(uint32_t uiLevel, uint32_t uiHp, uint32_t uiAttack)
        :m_uiLevel(uiLevel),m_uiHp(uiHp),m_uiAttack(uiAttack)
    {
    }
public:
    uint32_t m_uiLevel;
    uint32_t m_uiHp;
    uint32_t m_uiAttack;
};

//需要保存的数据类
class GameRole
{
public:
    GameRole(string strName)
        :m_strName(strName)
        ,m_uiLevel(1)
        ,m_uiHp(100)
        ,m_uiAttack(10)
    {
    }

    void Show()
    {
        cout << "Name:" << m_strName << " Level:" << m_uiLevel << " HP:" << m_uiHp << " ATK:" << m_uiAttack << endl;
    }

    Memento* Save()
    {
        Memento* pSaveInfo = new Memento(m_uiLevel, m_uiHp, m_uiAttack);
        return pSaveInfo;
    }

    void Load(Memento* pMem)
    {
        m_uiLevel = pMem->m_uiLevel;
        m_uiHp = pMem->m_uiHp;
        m_uiAttack = pMem->m_uiAttack;
        cout << "Loaded" << endl;
    }

private:
    string m_strName;
public:
    uint32_t m_uiLevel;
    uint32_t m_uiHp;
    uint32_t m_uiAttack;
};

//备忘管理者
class Recorder
{
public:
    void Record(Memento* pMem)
    {
        vecMemento.push_back(pMem);
        cout << "Saved" << endl;
    }
    Memento* Get(uint32_t uiIndex)
    {
        return vecMemento[uiIndex];
    }

private:
    vector<Memento*> vecMemento;
};
主函数中的使用
int main()
{
    Recorder oRecorder;
    GameRole oPlayer("Mark");
    oPlayer.Show();

    oRecorder.Record(oPlayer.Save());

    oPlayer.m_uiLevel = 100;
    oPlayer.m_uiHp = 1000;
    oPlayer.m_uiAttack = 100;
    oPlayer.Show();

    oPlayer.Load(oRecorder.Get(0));
    oPlayer.Show();

    return 0;
}
控制台输出结果
Name:Mark Level:1 HP:100 ATK:10
Saved
Name:Mark Level:100 HP:1000 ATK:100
Loaded
Name:Mark Level:1 HP:100 ATK:10

如有错误,欢迎指正

上一篇下一篇

猜你喜欢

热点阅读