// memento.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"
#include <list>
//memento模式的C++实现,改模式实现状态回滚,类似于文本编辑器的undo,或者数据的回滚功能。
//有相关应用的都可以通过memento模式来实现
using namespace std;
class iMememto;
class CState;
typedef list<iMememto*> _MEM_LIST_; //定义存储记录点的列表
//对外接口
class iMememto
{
public:
iMememto();
~iMememto();
virtual CState get()=0;
virtual void set(CState state)=0;
};
iMememto::iMememto()
{
}
iMememto::~iMememto()
{
}
// 记录详细信息,这里可以根据实际情况进行扩展
class CState
{
private:
string m_sName;
public:
string Get();
void put(string sName);
};
string CState::Get()
{
return m_sName;
}
void CState::put(string sName)
{
m_sName = sName;
}
//记录点管理器
class CareTaker
{
public:
void add(iMememto* mem); //存记录
iMememto* restore();//读记录
private:
_MEM_LIST_ m_list;
};
void CareTaker::add(iMememto* mem)
{
m_list.push_back(mem);
}
iMememto* CareTaker::restore()
{
iMememto* imem = m_list.back();
m_list.pop_back();
return imem;
}
//Originator,需要记录和复活的对象
class Originator
{
public:
iMememto* CreateMemen(const char* sRec);
void restore(iMememto* mem);
void print();
Originator();
~Originator();
private:
CState m_state; //状态
//memento放在内部是为了不让客户直接使用,memento可以根据实际情况随便扩展,不需要修改架构,这就是设计模式的依赖倒置原则。
class memento:iMememto
{
public:
CState m_state;
CState get()
{
return m_state;
}
void set(CState state)
{
m_state = state;
}
memento(CState state)
{
set(state);
}
memento()
{
}
~memento()
{
}
};
};
Originator::Originator()
{
m_state.put("remember_1");
}
Originator::~Originator()
{
}
//打印内部值
void Originator::print()
{
printf("this is %s\n",m_state.Get().c_str());
}
iMememto* Originator::CreateMemen(const char* sRec)
{
m_state.put(sRec);
return ((iMememto*)new memento(this->m_state));
}
void Originator::restore(iMememto* mem)
{
this->m_state = mem->get();
}
int _tmain(int argc, _TCHAR* argv[])
{
CareTaker caretaker;
Originator originaotr;
caretaker.add(originaotr.CreateMemen("number1")); //增加记录点
originaotr.print();
caretaker.add(originaotr.CreateMemen("number2")); //增加记录点
originaotr.print();
caretaker.add(originaotr.CreateMemen("number3")); //增加记录点
originaotr.print();
originaotr.restore(caretaker.restore()); //恢复记录
originaotr.print();
originaotr.restore(caretaker.restore()); //恢复记录
originaotr.print();
originaotr.restore(caretaker.restore()); //恢复记录
originaotr.print();
return 0;
}