设计模式之MemenTo模式

来源:互联网 发布:java访问oracle数据库 编辑:程序博客网 时间:2024/04/30 15:59
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();StateGetState();voidSetMemento(CMemento *_mt);voidResortMemento(CMemento *_mt);voidSetState(const State&st);voidPrintState();~COriginator();private:State _sdt;CMemento *_mt;};class CMemento{public:~CMemento();private:friend class COriginator;CMemento();CMemento(const State&st);StateGetState();voidSetState(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。

原创粉丝点击