备忘录模式(memento):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
模式实现:
[code]struct state{
wchar_t wcsstate[260];
};
class memento{
public:
memento(state *pstate): m_pstate(pstate) {}
state *getstate() { return m_pstate; }
private:
friend class originator;
state *m_pstate;
};
class originator{
public:
originator() : m_pstate(null) {}
~originator(){
//delete the storage of the state
if(m_pstate){
delete m_pstate;
m_pstate = null;
}
}
void setmemento(memento *pmemento);
memento * creatememento();
void setvalue(wchar_t *val){
memset(wcsvalue, 0, 260 * sizeof(wchar_t));
wcscpy_s(wcsvalue, 260, val);
}
void printstate() { std::wcout << wcsvalue << std::endl; }
private:
state *m_pstate; //to store the object's state
wchar_t wcsvalue[260]; //this is the object's real data
};
memento *originator::creatememento(){
m_pstate = new state;
if(m_pstate == null)
return null;
memento *pmemento = new memento(m_pstate);
wcscpy_s(m_pstate->wcsstate, 260, wcsvalue); //backup the value
return pmemento;
}
void originator::setmemento(memento *pmemento){
m_pstate = pmemento->getstate();
//recovery the data
memset(wcsvalue, 0, 260 * sizeof(wchar_t));
wcscpy_s(wcsvalue, 260, m_pstate->wcsstate);
}
//manager the memento
class caretaker{
public:
memento *getmemento() { return m_pmemento; }
void setmemento(memento *pmemento){
//free the previous memento
if(m_pmemento){
delete m_pmemento;
m_pmemento = null;
}
//set the new memento
m_pmemento = pmemento;
}
private:
memento *m_pmemento;
};
客户端:
[code]int main(){
originator *poriginator = new originator();
poriginator->setvalue(l"on");
poriginator->printstate(); //output: on
//now i backup the state
caretaker *pcaretaker = new caretaker();
pcaretaker->setmemento(poriginator->creatememento());
//set the new state
poriginator->setvalue(l"off");
poriginator->printstate(); //output: off
//recovery to the old state
poriginator->setmemento(pcaretaker->getmemento());
poriginator->printstate(); //output: on
if(pcaretaker)
delete pcaretaker;
if(poriginator);
delete poriginator;
return 0;
}
以上就是c++设计模式浅识备忘录模式的内容。