1、备忘录模式

本文详细介绍了备忘录模式在C++中的应用,通过代码实例展示了如何使用备忘录模式来保存和恢复对象的状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<pre name="code" class="cpp">#ifndef _MEMENTO_H_
#define _MEMENTO_H_

#include <iostream>
#include <vector>

using namespace std;

// 备忘录模式
struct Person
{
	int Mp;
	int Hp;

	Person()
	{
		Mp = 0;
		Hp = 0;
	}

	Person(int mp, int hp)
	{
		Mp = mp;
		Hp = hp;
	}

	// 运算符重载
	Person operator +(const Person& person)
	{
		return Person(this->Hp + person.Hp, this->Mp + person.Hp);
	}
};

enum PersonStat
{
	休息,
	战斗,
	行走,
};

// 备忘录的节点(保存发起人的状态)
class Memento
{
private:
	Person person;
	PersonStat personstat;

public:

	Memento(Person person, PersonStat personstat)
	{
		this->person.Hp = person.Hp;
		this->person.Mp = person.Mp;
		this->personstat = personstat;
	}

	Person GetPerson()
	{
		return person;
	}

	PersonStat GetPersonStat()
	{
		return personstat;
	}

	
};

// 备忘录节点的集合
class SetMemento
{
private:
	vector<Memento*> memento;

public:
	void SaveMemento(Memento* memento)
	{
		(this->memento).push_back(memento);
	}

	Memento* GetMemento(int i)
	{
		return memento[i];
	}
};

// 发起人
class Originator
{
private:
	Person m_person;
	PersonStat m_personstat;

public:

	void SetPersonAndStat(Person person, PersonStat personstat)
	{
		m_person = person;
		m_personstat = personstat;
	}

	// 回滚到某次状态
	void SetMemo(Memento* memo)
	{
		m_person = memo->GetPerson();
		m_personstat = memo->GetPersonStat();
	}

	Memento* CreateMemo()
	{
		return new Memento(m_person, m_personstat);
	}

	void Show()
	{
		cout << "MP: " << m_person.Mp << endl;
		cout << "HP: " << m_person.Hp << endl;
		printf("%s\n",  (m_personstat == 0)? "休息": ( (m_personstat == 1)? "行走":"战斗")  );
	}
};

#endif

int main(void)
{
	Originator* ori = new Originator();
	SetMemento* setmemento = new SetMemento();

	Person person1(10, 20);
	PersonStat personstat1 = 行走;
	ori->SetPersonAndStat(person1,  personstat1);
	setmemento->SaveMemento(ori->CreateMemo());
	ori->Show();

	Person person2(15, 25);
	PersonStat personstat2 = 休息;
	ori->SetPersonAndStat(person2, personstat2);
	setmemento->SaveMemento(ori->CreateMemo());
	ori->Show();

	Person person3(20, 30);
	PersonStat personstat3 = 战斗;
	ori->SetPersonAndStat(person3, personstat3);
	setmemento->SaveMemento(ori->CreateMemo());
	ori->Show();
	

	ori->SetMemo(setmemento->GetMemento(1));
	ori->Show();

	delete setmemento;
	delete ori;

	getchar();
	return 0;
}




                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值