备忘录模式(Memento Pattern)
Without violating encapsulation, capture and externalize an object’s internal state so that the object can be restored to this state later.
备忘录模式的意义在于它会捕获一个对象的内部状态,将其存储起来。等将来需要回滚时,就可以使用之前存储的状态。备忘录模式不关心到底是如何存储与恢复的,应为每个对象都可能有不同的备份恢复操作。备忘录模式只是一个对其过程的描述。
1class Card {
2 foo() {
3
4 }
5
6 bar() {
7
8 }
9
10 backup() {
11
12 }
13
14 restore() {
15
16 }
17}
备忘录模式通常用来实现undo/redo操作,前面已经说过的命令模式也是用来干这个的,但两种是不同的实现思路:
- 使用命令模式实现undo/redo,需要定义所有命令的反命令,这会是一个极大的工作量。而且可能有些命令的反命令会比命令本身更加复杂。但其优点是内存占用低,只需要记录调用过的命令就行了,因为整个系统所处的状态都是有命令/反命令+当前状态来实时计算出来的。
- 使用备忘录模式则不需要定义反命令,直接存下来当前系统的状态就行了,就像虚拟机的快照。但问题就是占用内存大,因为每个状态都会创建一份备份。所以可能需要一些diff算法来减少内存占用。