备忘录模式又叫做快照模式(Snapshot Pattern)或Token模式,是对象的行为模式
- 备忘录对象是一个用来存储另外一个对象内部状态的快照的对象
- 备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捕捉(Capture)住,并外部化,存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态
- 备忘录模式常常与命令模式和迭代子模式一同使用
“白箱”备忘录模式的实现
- 备忘录角色对任何对象都提供一个接口,即宽接口,备忘录角色的内部所存储的状态就对所有对象公开。因此这个实现又叫做“白箱实现”。
- “白箱”实现将发起人角色的状态存储在一个大家都看得到的地方,因此是破坏封装性的。但是通过程序员自律,同样可以在一定程度上实现模式的大部分用意。因此白箱实现仍然是有意义的。
“黑箱”备忘录模式的实现
- 在JAVA语言中,实现双重接口的办法就是将备忘录角色类设计成发起人角色类的内部成员类。
- 将Memento设成Originator类的内部类,从而将Memento对象封装在Originator里面;
- 在外部提供一个标识接口MementoIF给Caretaker以及其他对象。
- 这样,Originator类看到的是Menmento的所有接口,而Caretaker以及其他对象看到的仅仅是标识接口MementoIF所暴露出来的接口。
多重检查点
- 前面所给出的白箱和黑箱的示意性实现都是只存储一个状态的简单实现,也可以叫做只有一个检查点。常见的系统往往需要存储不止一个状态,而是需要存储多个状态,或者叫做有多个检查点。
- 备忘录模式可以将发起人对象的状态存储到备忘录对象里面,备忘录模式可以将发起人对象恢复到备忘录对象所存储的某一个检查点上。下面给出一个示意性的、有多重检查点的备忘录模式的实现。
“自述历史”模式
- 所谓“自述历史”模式(History-On-Self Pattern)实际上就是备忘录模式的一个变种。
- 在备忘录模式中,发起人(Originator)角色、负责人(Caretaker)角色和备忘录(Memento)角色都是独立的角色。
- 虽然在实现上备忘录类可以成为发起人类的内部成员类,但是备忘录类仍然保持作为一个角色的独立意义。
- 在“自述历史”模式里面,发起人角色自己兼任负责人角色。