(十一)备忘录模式

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

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的或者是容器的话,那么保存的时候会很耗资源的,所以这个模式不是用的越多越好,不过觉得都叫备忘录啦,应用场合应该是比较明显的吧,就用在那些回到某一时刻状态的地方!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值