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。