1、动机
在软件构建过程中,某些对象的状态在转换过程中,可能由于某种需要,要求程序能够回溯到对象之前处于某个点时的状态。如果使用一些共有接口来让其他对象得到对象的状态,便会暴露对象的细节。
如何实现对象状态的良好保存与恢复?但同时又不会因此而破坏对象本身的封装性。
2、备忘录模式定义
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样就可以在以后将该对象恢复到原先保存的状态。
3、举例
写一个类Memento用来保存某个状态(这里假设只用字符串state就可以表示某种状态,实际它可能由多个参数或者结构体才能表示):
再写一个类用来表示原始(正在使用)的状态:
调用过程也简约明了,中途需要的时候用Memento来保存某一刻的状态,然后执行过程会改变当前state,最后在使用Memento恢复:
4、结构图
5、要点总结
(1)备忘录(Memento)存储原发器(Originator)对象的内部状态,在需要时恢复原发器状态
(2)Memento模式的核心是信息隐藏,即Originator需要向外界隐藏信息,保持其封装性。但同时又需要将状态保存到外界(Memento)
(3)由于现代语言(如JAVA、C#)运行时,都具有相当的对象序列化,因此往往采用效率较高、又较容易正确实现的序列化方案来实现Memento模式