现在的位置: 首页 > 综合 > 正文

设计模式之MemenTo模式

2013年11月27日 ⁄ 综合 ⁄ 共 1836字 ⁄ 字号 评论关闭
Memento.h

#ifndef __MEMENTO_H_
#define __MEMENTO_H_
#include <string>
using namespace std;
typedef string State;
class CMemento;
class COriginator
{
public:
	COriginator();
	COriginator(const State&st);
	CMemento	*CreateMemento();
	State		GetState();
	void		SetMemento(CMemento *_mt);
	void		ResortMemento(CMemento *_mt);
	void		SetState(const State&st);
	void		PrintState();
	~COriginator();
private:
	State _sdt;
	CMemento *_mt;
};

class CMemento
{
public:
	~CMemento();
private:
	friend class COriginator;
	CMemento();
	CMemento(const State&st);
	State		GetState();
	void		SetState(const State&st);
private:
	State _sdt;
};
#endif

Memento.cpp

#include <iostream>
#include "Memento.h"
using namespace std;
COriginator::COriginator()
{
	_sdt="\0";
	_mt=0;
}

COriginator::~COriginator()
{
	if(_mt)
	{
		delete _mt;
		_mt=0;
	}

}
COriginator::COriginator(const State &st)
{
	_sdt=st;
	_mt=0;
}
CMemento* COriginator::CreateMemento()
{
	return new CMemento(_sdt);
}

void COriginator::SetState(const State &st)
{
	_sdt=st;
}

void COriginator::SetMemento(CMemento *_mt)
{

}
void COriginator::ResortMemento(CMemento *_mt)
{
	this->_sdt=_mt->GetState();
}
void COriginator::PrintState()
{
	cout<<"......"<<this->_sdt<<endl;
}
State COriginator::GetState()
{
	return _sdt;
}

CMemento::CMemento()
{


}
CMemento::~CMemento()
{

}
CMemento::CMemento(const State &st)
{
	_sdt=st;
}

void CMemento::SetState(const State &st)
{
	_sdt=st;
}

State CMemento::GetState()
{
	return _sdt;
}

Main.cpp

#include <iostream>
#include "Memento.h"
using namespace std;

int main() //Client
{
	COriginator *o=new COriginator();
	o->SetState("old");
	o->PrintState();

	CMemento *m=o->CreateMemento();
	o->SetState("new");
	o->PrintState();
	o->ResortMemento(m);

	o->PrintState();
	if(o)
	{
		delete o;
		o=0;
	}

	if(m)
	{
		delete m;
		m=0;
	}
	return 0;
}

Memento模式的关键就是friend class Originator;我们可以看到,Memento的接口都声明为private,而将Originator声明为Memento的友元类。我们将Originator的状态保存在Memento类中,而将Memento接口private起来,也就达到了封装的功效。
在Originator类中我们提供了方法让用户后悔:RestoreToMemento(Memento* mt);我们可以通过这个接口让用户后悔。在测试程序中,我们演示了这一点:Originator的状态由old变为new最后又回到了old。

抱歉!评论已关闭.