备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
ps:自行选择数据,不是所有数据都要备份的。
#include <iostream>
using namespace std;
class role_state_memento
{
public:
role_state_memento( int a, int d, int v ) :
attack( a ), defense( d ), vit( v ) {}
int get_attack() { return attack; }
int get_defense() { return defense; }
int get_vit() { return vit; }
private:
int attack;
int defense;
int vit;
};
class cracker
{
public:
void set_memento( role_state_memento *m )
{
memento = m;
}
role_state_memento *get_save_memento()
{
return memento;
}
private:
role_state_memento *memento;
};
class game_role
{
public:
void get_init_state()
{
attack = 100;
defense = 100;
vit = 100;
}
void fight()
{
attack = 0;
defense = 0;
vit = 0;
}
void display_state()
{
cout << "攻击力为:" << attack << endl ;
cout << "防御力为:" << defense << endl;
cout << "生命力为:" << vit << endl;
cout << endl;
}
role_state_memento *save_state()
{
return ( new role_state_memento( attack, defense, vit ));
}
void recovery_state( role_state_memento *memento )
{
attack = memento->get_attack();
defense = memento->get_defense();
vit = memento->get_vit();
}
private:
int attack;
int defense;
int vit;
};
int main()
{
cout << "角色初始化:" << endl;
game_role *g = new game_role;
g->get_init_state();
g->display_state();//角色初始化
cracker *c = new cracker;
c->set_memento( g->save_state() );//保存
cout << "战斗后:" << endl;
g->fight();
g->display_state();//战斗后
cout << "读取存档:" << endl;
g->recovery_state( c->get_save_memento() );
g->display_state();//读取之前的存档
}
我们用一个类role_state_memento来保存game_role的内部状态,为了不暴露细节,我们用cracker来管理role_state_memento,当要保存的时候,在game_role中用函数传一个role_state_memento的实例给cracker,当要保存的时候,cracker再把之前保存的role_state_memento传回给game_role!
缺点:如果game_role中的不是想int或者char型的这种比较小的数据类型,而是像string的或者是容器的话,那么保存的时候会很耗资源的,所以这个模式不是用的越多越好,不过觉得都叫备忘录啦,应用场合应该是比较明显的吧,就用在那些回到某一时刻状态的地方!