c++设计模式之备忘录模式 学习笔记

说一下该模式的定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
然后举一个几乎所有人都深有体会的例子:游戏进度保存。比如我最近玩的生存游戏*****,里面人物有:生命值,饥饿值,体力值。背包里还有各种物品。为了避免人物死掉丢失数据,我们会时不时的保存一下。这里面保存的就是当时的人物数据,可以用到备忘录模式。
接着介绍一下备忘录模式在游戏保存这个例子中都有哪几个类:人物类(就是游戏里的人物,该类拥有游戏中的人物中的所有属性和物品),保存内容类(该类中封装了需要保存的人物类中的内容),保存类(该类将打包的内容类保存起来,备用)
最后上代码:

#include<iostream>
#include<map>
#include<string>
#include<vector>
using namespace std;


class BackUp  //备份类
{
public:
	BackUp(int bloodVolume, int bodyStrength, int hungerValue, map<string, int> backpack)
	{
		m_bloodVolume = bloodVolume;
		m_bodyStrength = bodyStrength;
		m_hungerValue = hungerValue;
		m_backpack = backpack;

	}
	~BackUp()
	{

	}
private:
	int m_bloodVolume;  //生命值
	int m_bodyStrength;  //体力值
	int m_hungerValue; //饥饿值
	map<string, int> m_backpack; //背包

};

class Survivor  //游戏中的主角人物
{
public:
	Survivor()
	{
		m_bloodVolume = 100;
		m_bodyStrength = 100;
		m_hungerValue = 100;
	}
	~Survivor()
	{

	}
	BackUp* backUp()  //备份功能函数
	{
		m_backUp = new BackUp(m_bloodVolume, m_bodyStrength, m_hungerValue, m_backpack);
		return m_backUp;

	}
	/*******************增加功能*****************************************/
	void addBloodVolume(int number)  //医疗包等治疗物品
	{
		m_bloodVolume += number;
		if (m_bloodVolume > 200)
		{
			m_bloodVolume = 200;
		}
	}
	void addBodyStrength(int number)   //随着时间恢复
	{
		m_bodyStrength += number;
		if (m_bodyStrength > 200)
		{
			m_bodyStrength = 200;
		}
	}
	void addHungerValue(int number)  //食物等
	{
		m_hungerValue += number;
		if (m_hungerValue > 200)
		{
			m_hungerValue = 200;
		}
	}
	void addMaterial(string name, int num)
	{
		map<string, int> backpack= m_backpack;
		backpack[name] += num;
		if (backpack[name] > 20)
		{
			backpack[name] = 20;
		}
		if (backpack.size() <= 20)
		{
			m_backpack = backpack;
		}
	}
	/*******************减少功能,略*****************************************/

private:
	BackUp *m_backUp; //备份类
	int m_bloodVolume;  //生命值
	int m_bodyStrength;  //体力值
	int m_hungerValue; //饥饿值
	map<string, int> m_backpack; //背包
};

class Save  //存档读档类
{
public:
	void save(BackUp *backUp)
	{
		m_gameRecording.push_back(backUp);
	}
	BackUp* read(int index)
	{
		if (m_gameRecording.size() > index)
			return m_gameRecording[index];
	}
	~Save()
	{
		//析构指针。
	}
private:
	vector<BackUp*> m_gameRecording;
};

void main()
{
	Survivor leaderRole;
	Save archiveOffice;

	leaderRole.addBloodVolume(1000);
	leaderRole.addBodyStrength(2);
	leaderRole.addHungerValue(30);
	leaderRole.addMaterial("草药", 15);
	leaderRole.addMaterial("草药", 6);

	archiveOffice.save(leaderRole.backUp());

	system("pause");
	return;
}

如代码所示,三个类:人物类(Survivor),保存内容类(BackUp),保存类(Save)。其中,BackUp可以视为一个中转类或者包裹类。Survivor类可以打包自身数据,并以BackUp类的形式返回。Save类可以接受BackUp类型的“包裹”,并将其储存起来。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值