備忘錄模式(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++設計模式淺識備忘錄模式的內容,更多相關內容請關注PHP中文網(www.php.cn)!