1. 动机
- 在软件构建过程中,某些对象的状态在转换过程中,可能由于某种需求,需要程序能够重新回溯到对象之间某个点时的状态,如果使用一些公有接口来让其他对象得到对象的状态,便会暴露对象的实现细节。
- 如何实现对象状态的良好保存和恢复?但同时又不会因此而破坏对象本身的封装性。
2. 模式定义
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。
-----设计模式 GOF
3. 示例代码
class Momento
{
// 这个和下面类需要保存的状态是对应的
string state;
public:
Momento(const string &s)
: state(s)
{
}
string GetState(){
return state;
}
void SetState(const string &s)
{
state = s;
}
};
// 需要备忘的类
class Originator
{
// 需要保存的状态
string state;
// ...
public:
Originator(){}
Momento CtreateMemto(){
Momento m(state);
return m;
}
void SetMomento(const Momento &m){
state = m.GetState();
}
};
void main(){
Originator originator; //
// 捕获对象状态,存储到备忘录
auto momento = originator.CtreateMemto();
// originator状态修改
// ...
// 从备忘录中恢复状态
originator.SetMomento(momento)
}
4. 结构
上图的Catetaker就是我们上面代码的main函数
5. 要点总结
- 备忘录(momento)存储原发器(Originator)对象的内部状态,在需要的时候恢复原发器状态
- momento模式的核心是信息隐藏,即Originator需要向外隐藏信息,保持其封装性。但同时又需要将状态保持到外界(Momento)
- 这个模式看起来有点过时,因为我们有很多序列化的手段,但是我们需要知道该模式的思想