【发布时间】:2023-04-18 14:36:01
【问题描述】:
到目前为止,我在网上找到的所有示例和教程都涉及对值进行加减或其他操作的命令 - 计算器是常见的示例。
但是,如果您的命令与计算器中的命令不同,该怎么办?
想象一下像 Microsoft Visio 这样的绘图程序,用户在其中放置对象并将其移动到屏幕上的 x 和 y 位置。或者添加和删除对象。这些命令是不相关的,因此如果堆栈中的下一个命令是您需要撤消的创建对象命令,那么跟踪当前的 x、y 位置就没有任何意义。
任何建议如何处理?
【问题讨论】:
-
命令模式真的不能提供“撤消”。在其核心,它提供了一种将实现与您正在执行的操作分离的方法,例如,如果您有一个将对象移动到屏幕中间的按钮,使用命令模式,该按钮将仅调用类似 @ 987654321@ - 它不需要知道“真正的”实现是
obj.setX(width/2); obj.setY(height/2),因为该实现可以改变。如果你想撤销,看看 Redux 做了什么——每个命令都是一个修改,你可以通过应用反向来回滚它们。 -
然而,这依赖于保持一致的状态。要获得更“轻松”的解决方案,您可以将 Command 和 Memento 结合起来,以保留之前发生的事情的快照。这样回滚命令就是恢复快照。
标签: javascript design-patterns