备忘录模式:

  后悔药来啦!!!备忘录模式在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便在需要时能将该对象恢复到原先保存的状态。

备忘录模式的角色:

  1. 发起人(Originator):记录当前时刻的内部状态信息,提供创建备忘录和恢复备忘录数据的功能,实现其他业务功能,它可以访问备忘录里的所有信息。
  2. 备忘录(Memento):负责存储发起人的内部状态,在需要的时候提供这些内部状态给发起人。
  3. 管理者(CareTaker):对备忘录进行管理,提供保存与获取备忘录的功能,但其不能对备忘录的内容进行访问与修改。

优点:

  1. 给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态。
  2. 实现了信息的封装,使得用户不需要关心状态的保存细节。

缺点:

消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。

备忘录模式的应用场景:

  1.  需要保存/恢复数据的相关状态场景。
  2.  提供一个可回滚的操作。
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 Iindex)
        {
                if (Iindex >= vecStMemento.size())
                        return NULL;
                else
                        return vecStMemento[Iindex];
        }
};
//-------------------------------------------------------
//use
        STOriginator* pstOriginator = new STOriginator("xxx", 100);
        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();