【C++设计模式】备忘录模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}

猜你喜欢

转载自blog.csdn.net/zxh2075/article/details/82886768
今日推荐