备忘录模式(Memento Pattern)

概述:

我们玩单机游戏的时候总会遇到老婆大人的各位事情,一会去买瓶醋了,一会去打个酱油了,会耽误我们玩游戏的进程,但是此时我们能有“保存游戏”这个宝贝,我们的主基地不会在我们打酱油的时候被对手拆掉。

这“保存游戏”的功能其实就是备忘录模式的很好应用,她是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以就该对象恢复到原先保存的状态。这个其实也是我们的redo,undo所采用的模式。

类图和实例:

Memento-Pattern

简单的模式实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include <iostream>
#include <string>
using namespace std;
class Memento {
private:
string state;


public:
Memento()
{
state = "";
}
Memento(string state){
this->state = state;
}
string getState() {
return state;
}
void setState(string state) {
this->state = state;
}
};


class Originator {
private :
string state;


public:
Originator()
{
state = "";
}


string getState() {
return state;
}
void setState(string state) {
this->state = state;
}
Memento createMemento(){
return Memento(this->state);
}
void restoreMemento(Memento memento){
this->setState(memento.getState());
}
};




class Caretaker {
private :
Memento memento;
public :
Memento getMemento(){
return memento;
}
void setMemento(Memento memento){
this->memento = memento;
}
};
int main (int argc, char *argv[])
{
Originator originator;
originator.setState("状态1");
cout<<"初始状态:"<<originator.getState()<<endl;
Caretaker caretaker;
caretaker.setMemento(originator.createMemento());
originator.setState("状态2");
cout<<"改变后状态:"<<originator.getState()<<endl;
originator.restoreMemento(caretaker.getMemento());
cout<<"恢复后状态:"<<originator.getState()<<endl;
}

适用性:

适用于功能比较复杂的,但需要记录或维护属性历史的类;或者需要保存的属性只是众多属性中的一小部分时Originator可以根据保存的Memo还原到前一状态。

优缺点:

优点:

1)当发起人角色的状态有改变时,有可能是个错误的改变,我们使用备忘录模式就可以把这个错误改变还原。

2)备份的状态是保存在发起人角色之外的,这样,发起人角色就不需要对各个备份的状态进行管理。

缺点:

1)如果备份的对象存在大量的信息或者创建、恢复操作非常频繁,则可能造成很大的性能开销。

本文标题:备忘录模式(Memento Pattern)

文章作者:张小飞

发布时间:2018年05月01日 - 21:05

最后更新:2018年05月01日 - 21:05

原始链接:http://www.qtdoc.cn/2018/05/01/Memento-Pattern/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。