备忘录模式

来源:互联网 发布:java并发编程 豆瓣 编辑:程序博客网 时间:2024/06/05 03:07

#include <iostream.h>
#include <string.h>
#include <afx.h>
#include <vector>
using namespace std;

class Memento
{
public: //复制的数据是public
    int m_vitality; //生命值  
    int m_attack;   //进攻值  
    int m_defense;  //防守值 
public:
 Memento(int vitality, int attack, int defense)
 {
  m_vitality = vitality;
  m_attack   = attack;
  m_defense  = defense;
 }

    Memento& operator=(const Memento &memento)  
    { 
        m_vitality = memento.m_vitality; 
        m_attack = memento.m_attack; 
        m_defense = memento.m_defense; 
        return *this; 
    } 

};

class Originator
{
    int m_vitality; 
    int m_attack; 
    int m_defense; 
public:
 Originator(): m_vitality(100),m_attack(100),m_defense(100) {} 

    Memento Save()  //保存进度,只与Memento对象交互,并不牵涉到Caretake  
    {  
        Memento memento(m_vitality, m_attack, m_defense); 
        return memento; 
    } 

    void Load(Memento memento)  //载入进度,只与Memento对象交互,并不牵涉到Caretake  
    { 
        m_vitality = memento.m_vitality; 
        m_attack = memento.m_attack;  
        m_defense = memento.m_defense; 
    } 

    void Show() { cout<<"vitality : "<< m_vitality<<", attack : "<< m_attack<<", defense : "<< m_defense<<endl; } 
    void Attack() { m_vitality -= 10; m_attack -= 10;  m_defense -= 10; } 
};


class Caretaker
{
public: 
    Caretaker() {} 
    void Save(Memento menento) { m_vecMemento.push_back(menento); } 
    Memento Load(int state) { return m_vecMemento[state];}
 void delete_menento(int state) {m_vecMemento.erase(m_vecMemento.begin()+state);}
private: 
    vector<Memento> m_vecMemento; 

};

int main()
{
 int i=0;
    Caretaker caretake; 
    Originator role;  
    role.Show();   //初始值  
    caretake.Save(role.Save()); //保存状态0  

    role.Attack();    
    role.Show();  //进攻后  
 caretake.Save(role.Save()); //保存状态1  

    role.Attack();    
    role.Show();  //进攻后  
 caretake.Save(role.Save()); //保存状态2  

    role.Attack();    
    role.Show();  //进攻后  
 caretake.Save(role.Save()); //保存状态3 


    caretake.delete_menento(1);

 while(i<4)
 {
  role.Load(caretake.Load(i)); //载入状态   
  role.Show();  //恢复到状态0
  i++;
 }

    return 0; 

 cout<<"\nOK\n";
 return 1;
}