1. 动机
- 在软需要构建过程中,某些对象的状态在转换过程中,可能由于某种需求,要求程序能够回溯到对象之前处于某个时间点的状态。如果使用一些公有接口来让其他对象得到对象的状态,便会暴露对象的细节实现。
- 如何实现对象状态的良好保护与恢复?但同时又不会因此而破坏对象本身的封装性。
2. 模式定义
- 在不破坏封装性的前提下,捕获一个对象的内部状态,并且在该对象之外保存这个状态,这样以后就可以将该对象恢复到原先保存的状态。
3. 模式结构
![在这里插入图片描述](https://img-blog.csdnimg.cn/71e2a7978a4f45d9b94a14b857bc1800.png)
4. 模式实现
class Memento
{
string state;
public:
Memento(const string & s) : state(s) {}
string getState() const
{
return state;
}
void setState(const string & s)
{
state = s;
}
};
class Originator
{
string state;
public:
Originator() {}
Memento createMomento()
{
Memento m(state);
return m;
}
void setMomento(const Memento & m) {
state = m.getState();
}
};
int main()
{
Originator orginator;
Memento mem = orginator.createMomento();
orginator.setMomento(memento);
}
5. 要点总结
- 备忘录存储原发器对象的内部状态,在需要是恢复原发器的状态。
- 备忘录模式的核心是信息隐藏,即Originator需要向外接隐藏信息,保持其封装性。但同时有需要将状态保持到外界。
- 由于现代语言运行时都具有相当的对象序列化支持,因此往往采用效率高,且容易正确实现的序列化方案来实现备忘录模式