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; }