如何利用Memento模式设计存档

    所谓存档,实际上就是事先将物体状态暂时保存为一个副本,然后在必要的时候利用副本进行恢复,例如在仙剑里,我们在与厉害的boss过招时,一定会先存档,如果一旦不幸牺牲,就可以利用存档来重新开始,这里的存档,就涉及人物状态,场景状态等.

   以人物状态的恢复为例,如果使用memento模式来实现,我们需要三个对象:人物类,状态存储箱,存储箱管理者,这里对于什么是memento模式就不细说了,给出简单的实现例子,针对场景类等也适用,因此完整的存档读档需要多个备忘录共同工作完成.

    人物备忘录的实现(简单例子):

#include <iostream>

using namespace std;

class ObjDetailMemento{

public:
 virtual GetState( const int hp ){
  m_tempHp = hp;

 }
 virtual SetState( int& hp ){
  hp = m_tempHp;
 }

protected:
 int m_tempHp;

};

 

//----------------obj----------------------
class GameObj{

public:
 GameObj(){}
 GameObj( int hp, int mp ) : m_hp( hp ), m_mp( mp ){}

 void GameObjNowState(){
  void GameObjNowState(){
  cout<<"Hp is:"<<m_hp<<endl;
        cout<<"Mp is:"<<m_mp<<endl;

  if( m_hp > 0 )
   cout<<"人物活蹦乱跳"<<endl;
  else
            cout<<"人物革屁"<<endl;
 } }

 void BloodFight(){

  this->m_hp = 0;
  this->m_mp = 0;

 }

 ObjDetailMemento* GetStateCopy(){

  ObjDetailMemento* memPtr = new ObjDetailMemento();
  memPtr->GetState( m_hp );
  return memPtr;

 }
 void RestoreState( ObjDetailMemento* memPtr ){
  memPtr->SetState( m_hp );
 }
 
private:
 int m_hp;
 int m_mp;

};

 

//-----------------CareTaker
class CareTaker{

public:
 CareTaker( ObjDetailMemento* mineToCare ) : m_mementoPtr( mineToCare ){};
 ~CareTaker(){
  if( m_mementoPtr )
   delete m_mementoPtr;
 }
 ObjDetailMemento* GetMemento(){
  return m_mementoPtr;
 }

private:
    ObjDetailMemento* m_mementoPtr;

};

int main(){

 //开始游戏
 cout<<"开始游戏"<<endl;
 GameObj obj( 100, 100 );
 obj.GameObjNowState();

 //战前存储
 cout<<"存档"<<endl;
 CareTaker c( obj.GetStateCopy() );

 //大战失败
 cout<<"一场血战之后"<<endl;
    obj.BloodFight();
 obj.GameObjNowState();

 //读取存档
 cout<<"读档"<<endl;
 obj.RestoreState( c.GetMemento() );
 obj.GameObjNowState();

 return 0;

}

   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值