1.Originator(发起人):负责创建一个备忘录Memento,用以记录当前时刻自身的内部状态,并可使用备忘录恢复内部状态。Originator可以根据需要决定Memento存储自己的哪些内部状态。
2.Memento(备忘录):负责存储Originator对象的内部状态,并可以防止Originator以外的其他对象访问备忘录。备忘录有两个接口:Caretaker只能看到备忘录的窄接口,他只能将备忘录传递给其他对象。Originator却可看到备忘录的宽接口,允许它访问返回到先前状态所需要的所有数据。
3.Caretaker(管理者):负责备忘录Memento,不能对Memento的内容进行访问或者操作。
1 // Memento.cpp : 定义控制台应用程序的入口点。 2 // 3 4 #include "stdafx.h" 5 #include <iostream> 6 #include <string> 7 #include<vector> 8 using namespace std; 9 10 class Memento 11 { 12 13 public: 14 int m_vitality; //生命值 15 int m_attack; //进攻值 16 int m_defense; //防守值 17 Memento(int vitality,int attack,int defense):m_vitality(vitality),m_attack(attack),m_defense(defense) {} 18 Memento& operator=(const Memento &memento) 19 { 20 m_vitality = memento.m_vitality; 21 m_attack = memento.m_attack; 22 m_defense = memento.m_defense; 23 return *this; 24 } 25 }; 26 27 class GameRole 28 { 29 private: 30 int m_vitality; //生命值 31 int m_attack; //进攻值 32 int m_defense; //防守值 33 public: 34 GameRole():m_vitality(100),m_attack(100),m_defense(100) {} 35 Memento Save() 36 { 37 Memento memento(m_vitality,m_attack,m_defense); 38 return memento; 39 } 40 void Load(Memento memento) 41 { 42 m_vitality = memento.m_vitality; 43 m_attack = memento.m_attack; 44 m_defense = memento.m_defense; 45 } 46 void show() 47 { 48 cout<<"vitality:"<<m_vitality<<",attack:"<<m_attack<<",defense"<<m_defense<<endl; 49 } 50 void Attack() 51 { 52 m_vitality -= 10; 53 m_attack -= 10; 54 m_defense -= 10; 55 } 56 57 }; 58 59 class Caretake 60 { 61 public: 62 Caretake() {} 63 void Save(Memento memento){m_vecMemento.push_back(memento);} 64 Memento Load(int state) { return m_vecMemento[state]; } 65 private: 66 vector<Memento> m_vecMemento; 67 }; 68 69 70 int _tmain(int argc, _TCHAR* argv[]) 71 { 72 Caretake caretake; 73 GameRole role; 74 role.show(); //初始值 75 caretake.Save(role.Save()); //保存状态 76 role.Attack(); 77 role.show(); //进攻后 78 role.Load(caretake.Load(0)); //载入状态 79 role.show(); //恢复到状态0 80 system("pause"); 81 return 0; 82 }