版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zxh2075/article/details/82886768
#ifndef __MEMENTO_H__
#define __MEMENTO_H__
#include <iostream>
//备忘录模式:事先将某个时间点的实例的状态保存下来,之后在有必要时,再将实例恢复至当时的状态。
//使用备忘录,可以实现撤销功能。
//比如我们玩的游戏的存档功能,就可以通过备忘录实现。
//备忘录角色,用于保存某个实例的重要状态,如玩家的生命值
class Memento
{
public:
Memento(int life);
~Memento();
int GetLife();
private:
int m_life;
};
//敌人
class Enemy
{
public:
Enemy(int life);
~Enemy();
int GetLife();
private:
int m_life;
};
//玩家
class Gamer
{
public:
Gamer(int life);
~Gamer();
//创建备忘录
Memento * CreateMemento();
//恢复到备忘状态
void RestoreMemento(Memento * memento);
//同敌人战斗,扣除生命
int FightWith(Enemy * army);
private:
int m_life;
};
void TestMemento();
#endif
#include "Memento.h"
Memento::Memento(int life) : m_life(life)
{
}
Memento::~Memento()
{
}
int Memento::GetLife()
{
return m_life;
}
Enemy::Enemy(int life) : m_life(life)
{
}
int Enemy::GetLife()
{
return m_life;
}
Enemy::~Enemy()
{
}
Gamer::Gamer(int life) : m_life(life)
{
}
Gamer::~Gamer()
{
}
Memento * Gamer::CreateMemento()
{
return new Memento(m_life);
}
void Gamer::RestoreMemento(Memento * memento)
{
m_life = memento->GetLife();
}
int Gamer::FightWith(Enemy * army)
{
m_life -= army->GetLife();
if (m_life > 0)
{
printf("Win \n");
return 0;
}
else
{
printf("Lose \n");
return -1;
}
}
void TestMemento()
{
Gamer * gamer = new Gamer(100);
Memento * memento = gamer->CreateMemento();
for (int i=0; i<100; i++)
{
Enemy enemy(i);
//同敌人战斗,获胜则保存状态到备忘录,失败则回退到上次备忘状态
if (gamer->FightWith(&enemy) == 0)
{
delete memento;
memento = gamer->CreateMemento();
}
else
{
gamer->RestoreMemento(memento);
break;
}
}
delete memento;
delete gamer;
}