备忘录模式
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后接可将该对象恢复到原先保存的状态。
适用场景
1、必须保存一个对象在某一个时刻的 (部分)状态, 这样以后需要时它才能恢复到先前的状态。
2、如果一个用接口来让其它对象直接得到这些状态,将会暴露对象的实现细节并破坏对象的封装性。
采用菜鸟教程的例子,这里用C++实现
#include<iostream>
#include<string>
#include<vector>
using namespace std;
class Memento
{
public:
Memento(string tstate) { state = tstate; };
~Memento() {};
string getState() { return state; };
private:
string state;
};
class Originator
{
public:
Originator() {};
~Originator() {};
void setState(string tstate) { state = tstate; };
string getState() { return state; };
Memento* saveStateToMemento() { return new Memento(state); };
void getStateFromMemento(Memento *Memento) { state = Memento->getState(); };
private:
string state;
};
class CareTaker
{
public:
CareTaker() {};
~CareTaker() {
vector<Memento*>::iterator it;
for (it = mementoList.begin(); it != mementoList.end(); ++it)
{
delete (*it);
(*it) = NULL;
}
};
void add(Memento *state) {mementoList.push_back(state);}
Memento* get(int index) {return mementoList[index];}
private:
vector<Memento*> mementoList;
};
int main()
{
Originator *originator = new Originator();
CareTaker *careTaker = new CareTaker();
originator->setState("State #1");
originator->setState("State #2");
careTaker->add(originator->saveStateToMemento());
originator->setState("State #3");
careTaker->add(originator->saveStateToMemento());
originator->setState("State #4");
cout<<"Current State: " << originator->getState()<<endl;
originator->getStateFromMemento(careTaker->get(0));
cout<<"First saved State: " << originator->getState() << endl;
originator->getStateFromMemento(careTaker->get(1));
cout << "Second saved State: " << originator->getState() << endl;
delete originator;
originator = NULL;
delete careTaker;
careTaker = NULL;
}
在visual studio 2015上运行结果: