备忘录模式用于保存和恢复对象的状态。备忘录模式在游戏中非常常见,比如在玩老头环进入新关卡时,我们通常会把游戏存档一下。即使在新关卡内死亡,我们也会在读档点复活,能读取当时保存的状态完整地恢复到当时的环境。我们在进行软件系统的设计时候是要给用户后悔的权利(实际上可能也是用户要求的权利:)),我们对一些关键性的操作肯定需要提供诸如回退的操作。那这个后悔药就是 Memento 模式提供的。
Memento 模式的关键就是要在不破坏封装性的前提下,捕获并保存一个类的内部状态,这样就可以利用该保存的状态实施恢复操作。Memento 模式的关键就是 friend class Originator;我们可以看到,Memento 的接口都声明为 private,而将 Originator 声明为 Memento 的友元类。我们将 Originator 的状态保存在Memento 类中,而将 Memento 接口 private 起来,也就达到了封装的功效。UML图如下:
代码如下(示例):
#ifndef _MEMENTO_H_
#define _MEMENTO_H_
#include#includeclass Memento;
typedef std::string State;
class Originator
{public:
Originator();
Originator(const State& sdt);
~Originator();
Memento * CreateMemento();
void SetMemento(Memento* men);
void RestoreToMemento(Memento* mt);
State GetState();
void SetState(const State& sdt);
void PrintState();
protected:
private:
State _sdt;
Memento* _mt;
};
class Memento
{public:
protected:
private:
//将Originator为friend类,可以访问内部信息,但是其他类不能访问
friend class Originator;
Memento();
Memento(const State& sdt);
~Memento();
void SetState(const State& sdt);
State GetState();
private:
State _sdt;
};
#endif //_MEMENTO_H_
2.Subject.cpp代码如下(示例):
#include "Memento.h"
Originator::Originator()
{_sdt = "";
_mt = nullptr;
}
Originator::Originator(const State& sdt)
{_sdt = sdt;
_mt = nullptr;
}
Originator::~Originator()
{}
Memento* Originator::CreateMemento()
{return new Memento(_sdt);
}
State Originator::GetState()
{return _sdt;
}
void Originator::SetState(const State& sdt)
{_sdt = sdt;
}
void Originator::PrintState()
{std::cout<< this->_sdt<< "....."<< std::endl;
}
void Originator::SetMemento(Memento* men)
{}
void Originator::RestoreToMemento(Memento* mt)
{this->_sdt = mt->GetState();
}
//class Memento
Memento::Memento()
{}
Memento::Memento(const State& sdt)
{_sdt = sdt;
}
State Memento::GetState()
{return _sdt;
}
void Memento::SetState(const State& sdt)
{_sdt = sdt;
}
3.main.cpp代码如下(示例):
#include "Memento.h"
int main(int argc, char* argv[])
{//初始化信息,备忘前状态
Originator* o = new Originator();
o->SetState("old");
o->PrintState();
//创建备忘录,备份状态
Memento* m = o->CreateMemento();
//更改状态
o->SetState("new");
o->PrintState();
//回退状态
o->RestoreToMemento(m);
o->PrintState();
return 0;
}
Memento 模式运行结果如下:
很多时候我们需要回退到改变之前,即上一版本,而Memento 模式就提供了这样的功能,让我们有"后悔药"可吃。这种设计模式提供了一种可以恢复状态的机制;同时实现了信息的封装,用户无需关心状态的保存细节。但是当类的成员变量过多,备份内容需要占据巨大的内存,造成资源浪费,而且,每改变一次都需要对内容进行备份,当频繁修改时,操作繁琐。
本文参考《设计模式精解-GoF 23 种设计模式解析附 C++实现源码》,对内容进行整理,方便大家学习。如想学习详细内容,请参考此书。
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧