메멘토 모드: 객체의 내부 상태를 캡처하고 캡슐화를 파괴하지 않고 이 상태를 객체 외부에 저장합니다. 이렇게 하면 나중에 개체를 원래 저장된 상태로 복원할 수 있습니다.
패턴 구현 :
[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)!