Memento-Modus: Erfassen Sie den internen Zustand eines Objekts und speichern Sie diesen Zustand außerhalb des Objekts, ohne die Kapselung zu zerstören. Dadurch können Sie das Objekt später wieder in seinen ursprünglich gespeicherten Zustand versetzen.
Musterimplementierung:
[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; };
Kunde:
[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; }
Das Obige ist der Inhalt des C++-Designmusters, kurzes Verständnis des Memomusters und mehr Für verwandte Inhalte achten Sie bitte auf die chinesische PHP-Website (www.php.cn)!