• 设计模式-1.12备忘录模式


    1.定义:

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

    2.分类:行为型模式

    3.UML

    4.实例:
    举个简单的例子,我们玩游戏时都会保存进度,所保存的进度以文件的形式存在。这样下次就可以继续,而不用从头开始。这里的进度其实就是游戏的内部状态,而这里的文件相当于是在游戏之外保存状态。这样,下次就可以从文件中读入保存的进度,从而恢复到原来的状态。这就是备忘录模式。

     
    Memento类定义了内部的状态,而Caretake类是一个保存进度的管理者,GameRole类是游戏角色类。可以看到GameRole的对象依赖于Memento对象,而与Caretake对象无关。下面给出一个简单的是实现。

     1 //需保存的信息
     2 class Memento  
     3 {
     4 public:
     5     int m_vitality; //生命值
     6     int m_attack;   //进攻值
     7     int m_defense;  //防守值
     8 public:
     9     Memento(int vitality, int attack, int defense): 
    10       m_vitality(vitality),m_attack(attack),m_defense(defense){}
    11     Memento& operator=(const Memento &memento) 
    12     {
    13         m_vitality = memento.m_vitality;
    14         m_attack = memento.m_attack;
    15         m_defense = memento.m_defense;
    16         return *this;
    17     }
    18 };
    19 //游戏角色
    20 class GameRole  
    21 {
    22 private:
    23     int m_vitality;
    24     int m_attack;
    25     int m_defense;
    26 public:
    27     GameRole(): m_vitality(100),m_attack(100),m_defense(100) {}
    28     Memento Save()  //保存进度,只与Memento对象交互,并不牵涉到Caretake
    29     { 
    30         Memento memento(m_vitality, m_attack, m_defense);
    31         return memento;
    32     }
    33     void Load(Memento memento)  //载入进度,只与Memento对象交互,并不牵涉到Caretake
    34     {
    35         m_vitality = memento.m_vitality;
    36         m_attack = memento.m_attack; 
    37         m_defense = memento.m_defense;
    38     }
    39     void Show() { cout<<"vitality : "<< m_vitality<<", attack : "<< m_attack<<", defense : "<< m_defense<<endl; }
    40     void Attack() { m_vitality -= 10; m_attack -= 10;  m_defense -= 10; }
    41 };
    42 //保存的进度库
    43 class Caretake  
    44 {
    45 public:
    46     Caretake() {}
    47     void Save(Memento menento) { m_vecMemento.push_back(menento); }
    48     Memento Load(int state) { return m_vecMemento[state]; }
    49 private:
    50     vector<Memento> m_vecMemento;
    51 };
     1 //测试案例
     2 int main()
     3 {    
     4     Caretake caretake;
     5     GameRole role; 
     6     role.Show();   //初始值
     7     caretake.Save(role.Save()); //保存状态
     8     role.Attack();   
     9     role.Show();  //进攻后
    10     role.Load(caretake.Load(0)); //载入状态 
    11     role.Show();  //恢复到状态0
    12     return 0;
    13 }

    参考出处:http://blog.csdn.net/wuzhekai1985/article/details/6672906

  • 相关阅读:
    python基础学习笔记第二天 内建方法(s t r)
    p ython笔记第三天
    (转)字符编码笔记:ASCII,Unicode和UTF8
    const char * 和 char *const
    自己的毕业设计windows管理软件
    自己实现string类
    关于vs2003环境支持win7 的 IP设置
    很犀利的错误
    很容易犯的错误
    用C++ 设计一个不能被继承的类
  • 原文地址:https://www.cnblogs.com/ZhouYong-Travel/p/4147071.html
Copyright © 2020-2023  润新知