19.备忘录模式
意在解决的问题:
- 在软件构建过程中,某些对象的状态在转换过程中,可能由于某种需要,要求程序可回溯到对象之前处于某点时的状态。如果使用一些公有接口来让其他对象得到对象的状态,便会暴露对象的细节实现。
- 如何实现对象状态的良好保存和回复?但同时又不会因此破坏对象本身的封装性。
模式原理
class Memo{
string state;
public:
Memo(const string &s):state(s){}
Memo getState() const {return state;}
void setState(const string &s){state=s;}
};
class Originator{
string state;
public:
Originator(){}
Memo createMemo(){ Memo m(state); return m;}
void setMemo(const Memo& m){
state=m->getState();
}
};
int main(){
Originator originator;
MeMo mem=originator.createMemo();
originator.setMemo(mem);
return 0;
}
总结
- 备忘录存储原发器(originator)对象的内部状态,在需要时恢复原发器状态;
- Memo模式的核心是信息隐藏,即originator需要向外接隐藏信息,保持其封装性。但同时又需要状态保存在外界。
- 由于现在语言运行时都具有相当的对象序列化支持,因此往往采用效率高,又较容易正确实现的序列化方案来实现Memo,但是思想不变,即需要实现原发器信息隐藏,。
自己感悟
- 对于需要保存一下当前对象状态的操作,用户自己实现的话,首先肯定是不友好,因为用户还需要研究对象内部的变量;其次,用户自己实现的话,那么对象内部的变量就不再隐藏,而是不得不被开放,从而破坏了封装新。因此开发者自己定义一个备忘录,用于分段存储文件当前状态,方便用户后续想要恢复。