您好,欢迎访问一九零五行业门户网

C++设计模式浅识备忘录模式

备忘录模式(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++设计模式浅识备忘录模式的内容。
其它类似信息

推荐信息