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 }