GreensnoWorld
记录点滴,分享乐趣,一块凝固的时间
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;
}

 

LIJG
余本顽劣,生于紫云下,长于汝水滨。早年求学,兴趣广泛,好高骛远,学无所成,仓皇入世。兴趣所致,投身互联网,求知未证,而立已至,始悟光阴荏苒,终需务实钻研。故有此站,记录时光,积累点滴,验证所学,分享愚见。指舞方寸间,心系万千年。
留言