您的位置:首页 > 其它

1、备忘录模式

2015-04-24 10:41 176 查看
<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;
}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  备忘录模式