2016.备忘录模式
设计模式 2026年3月16日
#include <iostream>
#include <cstring>
using namespace std;
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(){
if(m_pState){
delete m_pState;
m_pState = NULL;
}
}
void SetMemento(Memento *pMemento);
Memento *CreateMemento();
void SetValue(wchar_t *value){
memset(wcsValue, 0, 260 * sizeof(wchar_t));
wcscpy(wcsValue, value);
}
void PrintState(){
wcout << wcsValue << endl;
}
private:
State *m_pState;
wchar_t wcsValue[260];
};
Memento *Originator::CreateMemento()
{
m_pState = new State;
if(m_pState == NULL){
return NULL;
}
Memento *pMemento = new Memento(m_pState);
wcscpy(m_pState->wcsState, wcsValue);
return pMemento;
}
void Originator::SetMemento(Memento *pMemento)
{
m_pState = pMemento->GetState();
memset(wcsValue, 0, 260 * sizeof(wchar_t));
wcscpy(wcsValue, m_pState->wcsState);
}
class Caretaker
{
public:
Memento *GetMemento()
{
return m_pMemento;
}
void SetMemento(Memento *pMemento)
{
if(m_pMemento){
delete m_pMemento;
m_pMemento = NULL;
}
m_pMemento = pMemento;
}
private:
Memento *m_pMemento;
};
int main()
{
Originator *pOriginator = new Originator();
pOriginator->SetValue(L"On");
pOriginator->PrintState();
Caretaker *pCaretaker = new Caretaker();
pCaretaker->SetMemento(pOriginator->CreateMemento());
pOriginator->SetValue(L"Off");
pOriginator->PrintState();
pOriginator->SetMemento(pCaretaker->GetMemento());
pOriginator->PrintState();
if(pCaretaker){
delete pCaretaker;
}
if(pOriginator){
delete pOriginator;
}
return 0;
}