备忘录模式(Memento)

1.目的

   如果某个对象(GameRole),需要存储其状态(数据),为了不对外暴露数据,它可以自己封装一个类(Memento),里面包含其感兴趣的数据,当需要存储时,使用自己的数据生成一个Memento的对象,并将其存储在CareTaker中,当需要Reload状态时,从CareTaker中取回Memento,然后Reload状态,并刷新自己



2.代码

Memento.h

#ifndef MEMENTO_H_
#define MEMENTO_H_
class Memento;

#define DEC_SET(para) void set##para(int )
#define IMP_SET(para) void GameRole::set##para(int arg) \
{\
	para = arg;\
}

class GameRole
{
public:
	GameRole();

	Memento& creatMemento();
	void reloadMemento(Memento&);

	void fight();
	void show();

	DEC_SET(vit);
	DEC_SET(atk);
	DEC_SET(def);

private:
	int vit;
	int atk;
	int def;
};

class Memento
{
public:
	Memento(int, int, int);
	void reload(GameRole&);
private:
	int vit;
	int atk;
	int def;
};

class CareTaker
{
public:
	void saveMemento(Memento&);
	Memento& getMemento();

private:
	Memento* mem;
};



#endif /* MEMENTO_H_ */

Memento.cpp

#include "Memento.h"
#include <iostream>

using namespace std;

GameRole::GameRole():vit(100), atk(100), def(100)
{}

void GameRole::fight()
{
	vit = 0;
	atk = 0;
	def = 0;
}

void GameRole::show()
{
	cout<<"vit = "<<vit<<" atk = "<<atk<<" def = "<<def<<endl;
}

Memento& GameRole::creatMemento()
{
	return *(new Memento(vit, atk, def));
}

void GameRole::reloadMemento(Memento& mem)
{
	mem.reload(*this);
}

IMP_SET(vit)
IMP_SET(atk)
IMP_SET(def)


/***********************************************/
Memento::Memento(int vit, int atk, int def):vit(vit), atk(atk), def(def)
{}

void Memento::reload(GameRole& role)
{
	role.setvit(vit);
	role.setatk(atk);
	role.setdef(def);
}

/*********************************************/
void CareTaker::saveMemento(Memento& arg)
{
	mem = &arg;
}

Memento& CareTaker::getMemento()
{
	return *mem;
}

void memento()
{
	GameRole role;
	CareTaker taker;

	role.show();

	taker.saveMemento(role.creatMemento());

	role.fight();
	role.show();

	role.reloadMemento(taker.getMemento());

	role.show();
};

3.扩展

   1.能否让GameRole自己去持有Memento?似乎也是可行的


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值