意图:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样就可以在以后将该对象恢复到原先保存的状态。
上下文:某些对象的状态在转换过程中,可能由于某种需要,要求程序能够回溯到对象之前处于某个点时的状态。如果使用一些公共接口来让其他对象得到对象的状态,便会暴露对象的细节实现。如何实现对象状态的保存与恢复,但同时又不会因此而破坏对象本身的封装性?
Memento:存储Originator(原发器)的内部状态,原发器根据需要决定Memento存储自己的哪些内部状态;防止Originator以外的其他对象访问Memento。Memento实际有两个接口,Caretaker只能看到其窄接口(只能将Memento传递给其他对象);而Originator可以看到一个宽接口(允许访问返回到之前状态所需的数据)。理想情况是,只允许生成该Memento的那个Originator访问该Memento的内部状态。
Originator:创建一个Memento,用以记录当前时刻的内部状态;使用Memento恢复内部状态。
Caretaker:负责保存Memento;不能对Memento的内容进行操作或检查。
代码
#include <iostream>
#include <list>
using namespace std;
class Memento;
class Originator{
public:
string state;
string getState() const;
void setState(const string &value);
Memento *CreateMemento();
void SetMemento(Memento *memento);
void show();
};
class Memento
{
public:
string state;
Memento(string s):state(s){
}
string getState() const;
};
string Memento::getState() const
{
return state;
}
Memento *Originator::CreateMemento(){
return new Memento(state);
}
void Originator::SetMemento(Memento *memento)
{
this->state = memento->state;
}
void Originator::show()
{
cout << "state:" << this->state << endl;
}
class Caretaker
{
public:
Memento *memento;
Memento *getMemento() const;
void setMemento(Memento *value);
};
Memento *Caretaker::getMemento() const
{
return memento;
}
void Caretaker::setMemento(Memento *value)
{
memento = value;
}
string Originator::getState() const
{
return state;
}
void Originator::setState(const string &value)
{
state = value;
}
int main(void)
{
Originator *o = new Originator();
o->state = "on";
o->show();
Caretaker *c = new Caretaker();
c->memento = o->CreateMemento();
o->state = "off";
o->show();
o->SetMemento(c->memento);
o->show();
}
结果
state:on
state:off
state:on