【问题标题】:Command design pattern for unrelated commands不相关命令的命令设计模式
【发布时间】: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


【解决方案1】:

假设“在轴上移动对象”+正确的命令是一个“对象”。然后命令模式处理该对象并包含命令。所以命令模式并不意味着“保持该对象的状态”。每次输入的对象都相同或不同。

在计算器的情况下,“删除命令”将与“删除对象命令”相同。

在此讨论之前,您使用命令模式移动物体的目的是什么?

【讨论】:

  • 我目前不使用命令模式。我将其视为向我的应用程序添加撤消/重做功能的解决方案。我在这里找到了类似的问题*.com/questions/3250104/…