// MementoPattern.cpp : 定义控制台应用程序的入口点。
//通过此实例了解设计模式里的“备忘录模式”
//备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可将该对象
//恢复到原先保存的状态
//下面采用《大话设计模式》的保存游戏进度的例子解释这一模式
#include "stdafx.h"
#include <vector>
#include <process.h>
#include <iostream>
using namespace std;
//备忘录类,在这个类中有要保存的信息
class CMemento
{
public:
CMemento(int v,int a,int d)
{
this->m_vitality=v;
this->m_attack=a;
this->m_defence=d;
}
CMemento& operator=(CMemento &m)
{
this->m_vitality=m.m_vitality;
this->m_attack=m.m_attack;
this->m_defence=m.m_defence;
return *this;
}
public:
int m_vitality;//生命值
int m_attack;//攻击力
int m_defence;//防守值
};
//游戏角色类
class CGameRole
{
public:
CGameRole()
{
this->m_vitality=100;
this->m_attack=100;
this->m_defence=100;
}
CMemento SaveTo()
{
CMemento m(m_vitality,m_attack,m_defence);
return m;
}
void Load(CMemento m)
{
this->m_vitality=m.m_vitality;
this->m_attack=m.m_attack;
this->m_defence=m.m_defence;
}
void ShowRoleInof() const
{
cout<<"vitality:"<<m_vitality<<" "<<"attack:"<<m_attack<<" "<<"defence:"<<m_defence<<endl<<endl;
}
void Attack()
{
this->m_attack-=20;
this->m_defence-=20;
this->m_vitality-=20;
}
private:
int m_vitality;//生命值
int m_attack;//攻击力
int m_defence;//防守值
};
//角色状态管理者类
class CRoleStateCaretaker
{
public:
CRoleStateCaretaker()
{
}
void SaveTo(CMemento m)
{
m_v.push_back(m);
}
CMemento Load(int state)
{
return m_v[state];
}
private:
vector<CMemento> m_v;
};
int _tmain(int argc, _TCHAR* argv[])
{
cout<<"-------备忘录模式测试案例--------------"<<endl<<endl;
cout<<"初始化角色状态"<<endl;
CRoleStateCaretaker cTaker;
CGameRole gRole;
gRole.ShowRoleInof();
cout<<"攻击一次后的角色状态"<<endl;
cTaker.SaveTo(gRole.SaveTo());
gRole.Attack();
gRole.ShowRoleInof();
cout<<"攻击两次后的角色状态"<<endl;
cTaker.SaveTo(gRole.SaveTo());
gRole.Attack();
gRole.ShowRoleInof();
cout<<"恢复到第一次攻击前的状态"<<endl;
gRole.Load(cTaker.Load(0));//因为向量里只保存了一份拷贝,所以从0处得到拷贝信息
gRole.ShowRoleInof();
cout<<"恢复到第二次攻击前的状态"<<endl;
gRole.Load(cTaker.Load(1));//因为向量里保存了两份拷贝,所以从1处得到拷贝信息
gRole.ShowRoleInof();
system("pause");
return 0;
}