我们玩单机游戏的时候总会遇到老婆大人的各位事情,一会去买瓶醋了,一会去打个酱油了,会耽误我们玩游戏的进程,但是此时我们能有“保存游戏”这个宝贝,我们的主基地不会在我们打酱油的时候被对手拆掉。
这“保存游戏”的功能其实就是备忘录模式的很好应用,她是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以就该对象恢复到原先保存的状态。这个其实也是我们的redo,undo所采用的模式。
类图和实例:
简单的模式实例:
#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)如果备份的对象存在大量的信息或者创建、恢复操作非常频繁,则可能造成很大的性能开销。
作者:LCL_data