设计模式-1.12备忘录模式

1.定义:

备忘录模式:Memento,在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态[DP]

2.分类:行为型模式

3.UML

4.实例:
举个简单的例子,我们玩游戏时都会保存进度,所保存的进度以文件的形式存在。这样下次就可以继续,而不用从头开始。这里的进度其实就是游戏的内部状态,而这里的文件相当于是在游戏之外保存状态。这样,下次就可以从文件中读入保存的进度,从而恢复到原来的状态。这就是备忘录模式。

 
Memento类定义了内部的状态,而Caretake类是一个保存进度的管理者,GameRole类是游戏角色类。可以看到GameRole的对象依赖于Memento对象,而与Caretake对象无关。下面给出一个简单的是实现。

 1 //需保存的信息
 2 class Memento  
 3 {
 4 public:
 5     int m_vitality; //生命值
 6     int m_attack;   //进攻值
 7     int m_defense;  //防守值
 8 public:
 9     Memento(int vitality, int attack, int defense): 
10       m_vitality(vitality),m_attack(attack),m_defense(defense){}
11     Memento& operator=(const Memento &memento) 
12     {
13         m_vitality = memento.m_vitality;
14         m_attack = memento.m_attack;
15         m_defense = memento.m_defense;
16         return *this;
17     }
18 };
19 //游戏角色
20 class GameRole  
21 {
22 private:
23     int m_vitality;
24     int m_attack;
25     int m_defense;
26 public:
27     GameRole(): m_vitality(100),m_attack(100),m_defense(100) {}
28     Memento Save()  //保存进度,只与Memento对象交互,并不牵涉到Caretake
29     { 
30         Memento memento(m_vitality, m_attack, m_defense);
31         return memento;
32     }
33     void Load(Memento memento)  //载入进度,只与Memento对象交互,并不牵涉到Caretake
34     {
35         m_vitality = memento.m_vitality;
36         m_attack = memento.m_attack; 
37         m_defense = memento.m_defense;
38     }
39     void Show() { cout<<"vitality : "<< m_vitality<<", attack : "<< m_attack<<", defense : "<< m_defense<<endl; }
40     void Attack() { m_vitality -= 10; m_attack -= 10;  m_defense -= 10; }
41 };
42 //保存的进度库
43 class Caretake  
44 {
45 public:
46     Caretake() {}
47     void Save(Memento menento) { m_vecMemento.push_back(menento); }
48     Memento Load(int state) { return m_vecMemento[state]; }
49 private:
50     vector<Memento> m_vecMemento;
51 };
 1 //测试案例
 2 int main()
 3 {    
 4     Caretake caretake;
 5     GameRole role; 
 6     role.Show();   //初始值
 7     caretake.Save(role.Save()); //保存状态
 8     role.Attack();   
 9     role.Show();  //进攻后
10     role.Load(caretake.Load(0)); //载入状态 
11     role.Show();  //恢复到状态0
12     return 0;
13 }

参考出处:http://blog.csdn.net/wuzhekai1985/article/details/6672906

原文地址:https://www.cnblogs.com/ZhouYong-Travel/p/4147071.html