我可以想到两种简单的方法来实现“撤消”的魔力:将更改保存在队列中,直到您确实必须推送它们,或者将反向操作推送到您所做的每个更改到撤消队列中。
第一个看起来像这样:
User Action | Action Queue | actual list
---------------------------------------
nothing | empty | {}
push 5 | {push 5} | {}
push 2 | {push 2, push 5} | {}
print list | {} | {5, 2}
只有当用户执行需要渗透更改的操作(如打印或获取)时,您才会真正进行更改。然后撤消将只是从操作队列中弹出。
另一种选择是存储反向队列:
User Action | Reverse Queue | actual list
---------------------------------------
nothing | empty | {}
push 5 | {pop} | {5}
push 2 | {pop, pop} | {5, 2}
pop | {push 2, pop, pop} | {5}
undo | {pop, pop} | {5, 2}
在这里,用户所做的任何事情都会立即渗透,并且您将操作的反向推送到反向队列中。然后撤消是弹出反向队列并采取行动。
虽然第一个更容易实现,但这意味着您在“推送更改”后无法撤消。