<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;
}
1、备忘录模式
最新推荐文章于 2025-08-16 00:18:55 发布