规范策略是使用
Command pattern.您将代表可以作为Command对象执行的操作,并且每个对象都放在堆栈中.然后,应用程序的状态由初始状态加上堆栈具有的所有内容定义.因此,“撤销”操作然后只是弹出顶部堆栈项并将剩余项重新应用到初始状态.
实际上,有时将这些操作应用于初始状态以生成当前状态是昂贵的.例如,对于一系列复杂的图像调整,可能会出现这种情况,就像在Photoshop中找到的那样.在这种情况下,在内存中保持交替状态堆栈序列是很常见的:
+---------+
| state_0 |
+---------+ +---------+
| next -------> | stack_0 |
+---------+ +---------+
| data | +---------+
| next -------> | state_1 |
+---------+ +---------+
| next ----- ...
+---------+
每个stack_i保持命令,直到它超过某些预设复杂度(例如,命令超过计算成本X)或有序(例如,堆栈保持X或更多命令)限制.此时,创建新的中间状态对象state_i 1以封装状态,并且创建新的空堆栈stack_i 1以保存新命令.
这样,您只需将一小段命令应用于上次快照状态即可获得当前状态.这是以记忆整个状态为代价的,这对于非常大的应用程序可能是不可行的,但是您可以选择仅对一组状态进行快照以进行优化.