美文网首页
c++备忘录模式

c++备忘录模式

作者: 一路向后 | 来源:发表于2021-02-23 21:26 被阅读0次

1.备忘录模式简介

   备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。

2.源码实现

#include <iostream>
#include <string>
#include <vector>

using namespace std;

class STMemento
{
private:
    int iVitality;

public:
    STMemento(){};

    STMemento(int iVitality)
    {
        this->iVitality = iVitality;
    }

    int GetVitality() const
    {
        return this->iVitality;
    }
};

class STOriginator
{
private:
    int iVitality;
    string name;

public:
    STOriginator(string strName, int iVit) : iVitality(iVit), name(strName)
    {

    }

    STMemento *SaveState()
    {
        return new STMemento(iVitality);
    }

    void RecoverState(const STMemento *stMemento)
    {
        this->iVitality = stMemento->GetVitality();
    }

    void SetVitality(int iVit)
    {
        this->iVitality = iVit;
    }

    void Show()
    {
        cout << "Name: " << name << endl;
        cout << "Live: " << iVitality << endl;
    }
};

class STCareTaker
{
private:
    vector<STMemento *> vecStMemento;

public:
    void AddMemento(STMemento *stMemento)
    {
        vecStMemento.push_back(stMemento);
    }

    STMemento *GetMemento(int index)
    {
        if(index >= vecStMemento.size())
            return NULL;
        else
            return vecStMemento[index];
    }
};

int main(int argc, char **argv)
{
    STOriginator *pstOriginator = new STOriginator("xxx", 10);

    cout << "原始状态: " << endl;
    pstOriginator->Show();

    STCareTaker *pstCareTaker = new STCareTaker();
    pstCareTaker->AddMemento(pstOriginator->SaveState());

    pstOriginator->SetVitality(50);
    cout << "战斗后状态: " << endl;
    pstOriginator->Show();

    pstOriginator->RecoverState(pstCareTaker->GetMemento(0));
    cout << "归档后状态: " << endl;
    pstOriginator->Show();

    return 0;
}

3.编译源码

$ g++ -o example example.cpp

4.运行及其结果

$ ./example
原始状态: 
Name: xxx
Live: 10
战斗后状态: 
Name: xxx
Live: 50
归档后状态: 
Name: xxx
Live: 10

相关文章

网友评论

      本文标题:c++备忘录模式

      本文链接:https://www.haomeiwen.com/subject/zfvdfltx.html