1.目的
如果某个对象(GameRole),需要存储其状态(数据),为了不对外暴露数据,它可以自己封装一个类(Memento),里面包含其感兴趣的数据,当需要存储时,使用自己的数据生成一个Memento的对象,并将其存储在CareTaker中,当需要Reload状态时,从CareTaker中取回Memento,然后Reload状态,并刷新自己
2.代码
Memento.h
#ifndef MEMENTO_H_
#define MEMENTO_H_
class Memento;
#define DEC_SET(para) void set##para(int )
#define IMP_SET(para) void GameRole::set##para(int arg) \
{\
para = arg;\
}
class GameRole
{
public:
GameRole();
Memento& creatMemento();
void reloadMemento(Memento&);
void fight();
void show();
DEC_SET(vit);
DEC_SET(atk);
DEC_SET(def);
private:
int vit;
int atk;
int def;
};
class Memento
{
public:
Memento(int, int, int);
void reload(GameRole&);
private:
int vit;
int atk;
int def;
};
class CareTaker
{
public:
void saveMemento(Memento&);
Memento& getMemento();
private:
Memento* mem;
};
#endif /* MEMENTO_H_ */
Memento.cpp
#include "Memento.h"
#include <iostream>
using namespace std;
GameRole::GameRole():vit(100), atk(100), def(100)
{}
void GameRole::fight()
{
vit = 0;
atk = 0;
def = 0;
}
void GameRole::show()
{
cout<<"vit = "<<vit<<" atk = "<<atk<<" def = "<<def<<endl;
}
Memento& GameRole::creatMemento()
{
return *(new Memento(vit, atk, def));
}
void GameRole::reloadMemento(Memento& mem)
{
mem.reload(*this);
}
IMP_SET(vit)
IMP_SET(atk)
IMP_SET(def)
/***********************************************/
Memento::Memento(int vit, int atk, int def):vit(vit), atk(atk), def(def)
{}
void Memento::reload(GameRole& role)
{
role.setvit(vit);
role.setatk(atk);
role.setdef(def);
}
/*********************************************/
void CareTaker::saveMemento(Memento& arg)
{
mem = &arg;
}
Memento& CareTaker::getMemento()
{
return *mem;
}
void memento()
{
GameRole role;
CareTaker taker;
role.show();
taker.saveMemento(role.creatMemento());
role.fight();
role.show();
role.reloadMemento(taker.getMemento());
role.show();
};
3.扩展
1.能否让GameRole自己去持有Memento?似乎也是可行的