`

备忘录模式(Memento)

 
阅读更多
备忘录(Memento):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态.

备忘录模式比较适用于功能比较复杂的,但需要维护或记录属性历史的类,或者需要保存的属性只是众多属性中的一小部分时,Originator可以根据保存的Memento信息还原到前一状态.

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

class Player
{
public:
    int mHp;
    int mMp;
    int mAp;
};

class Game
{
public:
    Game()
    {
        mCurrentPlayer.mAp = 10;
        mCurrentPlayer.mHp = 10;
        mCurrentPlayer.mMp = 10;
        mNum = 1;
    }

    ~Game(){}

    void showStatus()
    {
        cout << "当前角色,hp:" << mCurrentPlayer.mHp << ",mp:" << mCurrentPlayer.mMp
             << ",ap:" << mCurrentPlayer.mAp << endl;
    }

    void killNPC1()
    {
        mCurrentPlayer.mAp += 10;
        mCurrentPlayer.mHp += 10;
        mCurrentPlayer.mMp += 10;
        cout << "消灭1号怪物" << endl;
    }

    void killBoss1()
    {
        if(mCurrentPlayer.mHp<30)
        {
            cout << "实力不足,被boss1消灭" << endl;
            mCurrentPlayer.mHp = 10;
            return;
        }
        cout << "消灭boss1" << endl;
    }

    void killBoss2()
    {
        if(mCurrentPlayer.mHp<300)
        {
            cout << "实力不足,被boss2消灭" << endl;
            mCurrentPlayer.mHp = 10;
            return;
        }
        cout << "消灭boss2" << endl;
    }

    //创建存档
    void createMemento(int num)
    {
        mNum = num;
        mPlayerMap.insert(make_pair<int,Player>(mNum,mCurrentPlayer));
        cout << "将当前环境存档,编号:" << num << endl;
    }

    //档读存储
    void loadMemento(const map<int,Player>& playerMap)
    {
        mPlayerMap.clear();
        for(map<int,Player>::const_iterator iter = playerMap.begin();
                                            iter!=playerMap.end();++iter)
        {
            mPlayerMap.insert(make_pair<int,Player>((*iter).first,(*iter).second));
        }
        cout << "导入一个强力的存档" << endl;
    }

    //读取存档
    void restoreMemento(int num)
    {
        for(map<int,Player>::const_iterator iter = mPlayerMap.begin();
                                            iter!=mPlayerMap.end();++iter)
        {
            if((*iter).first==num)
            {
                mCurrentPlayer.mAp = (*iter).second.mAp;
                mCurrentPlayer.mHp = (*iter).second.mHp;
                mCurrentPlayer.mMp = (*iter).second.mMp;
                cout << "读取存档:" << num << endl;
            }
        }
    }

private:
    Player mCurrentPlayer;

    map<int,Player> mPlayerMap;

    int mNum;
};

int main()
{
    Game* game = new Game;
    game->killNPC1();
    game->createMemento(1);
    game->killBoss1();
    game->restoreMemento(1);
    game->showStatus();
    game->killNPC1();
    game->restoreMemento(2);
    game->killBoss1();
    game->killBoss2();
    map<int,Player> m;
    Player seniorPlayer;
    seniorPlayer.mAp = 1000;
    seniorPlayer.mHp = 1000;
    seniorPlayer.mMp = 1000;
    m.insert(make_pair<int,Player>(1000,seniorPlayer));
    game->loadMemento(m);
    game->restoreMemento(1000);
    game->killBoss2();
}

消灭1号怪物
将当前环境存档,编号:1
实力不足,被boss1消灭
读取存档:1
当前角色,hp:20,mp:20,ap:20
消灭1号怪物
消灭boss1
实力不足,被boss2消灭
导入一个强力的存档
读取存档:1000
消灭boss2
分享到:
评论

相关推荐

    设计模式之备忘录模式(Memento Pattern)

    备忘录模式(Memento Pattern)是软件设计模式中的一种行为模式,它的主要目的是在不破坏对象封装性的前提下,允许对象在特定时刻保存其内部状态,并能够在之后恢复到保存时的状态。这种模式广泛应用于撤销/重做功能...

    设计模式之备忘录(memento)

    备忘录模式主要涉及三个角色: 1. **发起人(Originator)**:需要保存其内部状态的对象。它创建并存储备忘录,也可以从备忘录恢复状态。 2. **备忘录(Memento)**:存储发起人的内部状态。备忘录是发起人的私有...

    设计模式之备忘录模式(Memento)

    备忘录模式(Memento Pattern)是设计模式中的一种行为模式,主要目的是在不违反封装原则的情况下,保存一个对象的内部状态,以便在需要时能够恢复到先前的状态。这种模式通常用于实现撤销/重做功能或者在游戏中保存...

    备忘录模式.rar备忘录模式.rarjava设计模式

    备忘录模式是一种行为设计模式,它允许在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将对象恢复到原先保存的状态。这种模式常用于需要记录用户操作历史或者游戏进度...

    C#面向对象设计模式纵横谈(21):(行为型模式) Memento 备忘录模式

    备忘录模式(Memento Pattern)是一种行为设计模式,它允许在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将对象恢复到先前的状态。这种模式在需要撤销/重做功能、...

    设计模式_备忘录模式.zip

    备忘录模式是一种在软件工程中广泛使用的结构型设计模式,其主要目的是为了在不破坏封装性的前提下,能够安全地保存对象的状态,并在需要时恢复到先前保存的状态。这种模式通常用于那些需要记录和回滚操作的重要场景...

    C#备忘录模式 代码例子

    备忘录模式是一种设计模式,它在不破坏封装性的前提下,保存对象的内部状态,以便在需要的时候恢复。在C#中,备忘录模式常用于实现撤销/重做功能,或者在需要记录和恢复对象状态的情况下。下面将详细解释备忘录模式...

    java设计模式-备忘录模式源代码

    在Java中,备忘录模式通常包括三个关键角色:原始对象(Originator)、备忘录(Memento)和管理者(Caretaker)。原始对象是需要保存状态的对象,它创建并存储在备忘录中的状态。备忘录负责存储原始对象的状态,而...

    备忘录模式代码示例

    备忘录模式的核心组件包括发起人(Originator)角色、备忘录(Memento)角色和照料者(Caretaker)角色。 发起人是拥有复杂状态的对象,它创建并恢复备忘录。在我们的示例代码中,可能有一个名为`Originator`的类,...

    备忘录模式实现及案例

    备忘录模式是一种设计模式,属于行为模式类型,它的主要作用是保存对象的状态,以便在需要的时候能够恢复到之前的状态。这种模式的核心在于提供一种方式,可以在不破坏封装的前提下,捕获并存储一个对象的内部状态,...

    设计模式之备忘录模式

    备忘录模式(Memento Pattern)是软件设计模式中的一种,属于行为模式。它提供了一种方式来恢复对象到之前的状态,即“撤销”操作。备忘录模式的核心思想是保存对象的内部状态,以便在需要时能恢复到这个状态,而...

    备忘录模式Demo

    备忘录模式是一种设计模式,它在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将对象恢复到原先保存的状态。这种模式常用于需要记录用户操作或者游戏进度等场景,允许...

    设计模式之备忘录模式,内含可运行代码及详细解释

    备忘录模式是一种常用的设计模式,它在软件工程中扮演着重要的角色,特别是在需要保护对象内部状态不被外部篡改的场景下。备忘录模式的核心思想是提供一种方法来捕获一个对象的内部状态,并在该对象之外保存这个状态...

    设计模式之备忘录模式的Java版本实现

    在Java中实现备忘录模式,我们通常会定义三个关键角色:原始对象(Originator)、备忘录(Memento)和照料者(Caretaker)。首先,原始对象创建并维护其状态,它知道如何创建备忘录,并且可以在需要时使用备忘录恢复...

    设计模式-备忘录模式(讲解及其实现代码)

    备忘录模式是一种在软件工程中广泛使用的面向对象设计模式,它主要用来安全地保存对象的状态,以便在需要时能够恢复到先前的状态。备忘录模式的核心思想是封装对象的状态,将其保存到一个独立的对象(备忘录)中,而...

    设计模式 - 备忘录模式(C++实例)

    在C++中,备忘录模式通常包含三个角色:发起人(Originator)、备忘录(Memento)和照料者(Caretaker)。发起人是创建和恢复状态的对象,备忘录负责存储发起人的状态,而照料者则负责管理备忘录,避免对发起人状态...

    备忘录模式(Memento) 注册时用的

    备忘录模式(Memento Pattern)是一种设计模式,它允许对象在不破坏封装性的前提下,捕获并存储其内部状态,以便在需要时恢复到先前的状态。这种模式常用于撤销/重做功能,或者在注册过程中保存用户信息,防止因意外...

    Java设计模式-备忘录

    在Java中,备忘录模式通常包含三个角色:**发起人(Originator)**、**备忘录(Memento)**和**照料者(Caretaker)**。 1. **发起人(Originator)**:这是创建备忘录并需要恢复状态的对象。它知道如何创建备忘录...

    备忘录模式 C++ 实现

    备忘录模式是一种行为设计模式,它允许在不破坏封装性的前提下,捕获和恢复一个对象的内部状态。在C++中实现备忘录模式,可以有效地帮助开发者在程序运行过程中保存对象的状态,以便在需要时恢复到之前的状态,这...

Global site tag (gtag.js) - Google Analytics