标签:nat 序列化 memento模式 过程 备忘录 如何 lol 定义 friend
动机
在软件构建过程中,某些对象的状态在转换过程中,可能由于某种需要,要求程序能够回溯到对象之前处于某个点时的状态。如果使用一些公用接口来让其他对象得到对象的状态,便会暴露对象的细节实现。
如何实现对象状态的良好保存与恢复?但同时又不会因此而破坏对象本身的封装性。
定义
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将对象恢复到原先保存的状态。
结构
Memento:备忘录存储原发器对象的内部状态。原发器根据需要决定备忘录存储原发器的哪些内部状态;
Originator:原发器创建一个备忘录,用以记录当前时刻它的内部状态;我们使用备忘录恢复内部状态;
Caretaker:发出创建备忘录的指令;但是,不能对备忘录的内容进行操作或检查。
管理器向原发器请求一个备忘录,在将来的某个时间,将其送回给原发器;而有的时候管理者不会将备忘录返回给原发器,因为原发器可能不需要退到先前的状态。备忘录是被动的,只有创建备忘录的原发器会对它的状态进行赋值和检索,如下面的时序图:
示例
class State{
State(const State& _state);
/****/
}
class Memento{
friend class Originator;
public:
Memento(State* _pSate)
:m_sate(new State(_pSate)) {}
private:
State* m_state;
}
class Originator{
public:
Memento* CreateMemento(){
return new Memento(m_origin_state);
}
void SetMemento(Memento* m){
if(m_origin_state){
delete m_origin_state;
}
m_origin_state=new State(m);
}
private:
State* m_origin_state;
}
class CareTaker{
public:
CareTaker(Originator* _pOriginator)
:m_pOriginator(_pOriginator) {}
void Create(){
m_pMemento=m_pOriginator->CreateMemento();
}
void Recover(){
m_pOriginator->SetMemento(m_pMemento);
}
private:
Menmento* m_pMemento;
Originator* m_pOriginator;
}
要点总结
1.备忘录(Memento)存储原发器( Originator)对象的内部状态,在需要时恢复原发器状态。
2.由于现代语言运行时(如C#、Java等)都具有相当的对象序列化支持,因此往往采用效率更高、又较容易正确实现的序列化方案来实现Memento模式。
标签:nat 序列化 memento模式 过程 备忘录 如何 lol 定义 friend
原文地址:https://www.cnblogs.com/Redwarx008/p/12267409.html