c++设计模式--备忘录模式

// 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;
}
 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值