命令模式:我怎样才能做连续的动作? (例如移动物体)

Command pattern: how can I do continuous actions? (e.g. moving an object)

假设我正在制作一个程序,用户可以在其中绘制然后移动形状。 MoveCommand 然后看起来像这样:

class MoveCommand {
public:
    MoveCommand(Shape& shape, const Vector2f& offset) :
            shape(shape), offset(offset)
    { }

    void execute() {
        shape.move(offset);
    } 

    void undo() {
        shape.move(-offset);
    }
private:
    Shape& shape;
    Vector2f offset;
};

效果很好,但我如何显示移动预览(当用户按住鼠标按钮时),然后仅在释放鼠标按钮时存储最终偏移量?

是否应该 ShapeEditor class 移动形状然后在释放按钮时创建 MoveCommand?如果 execute() 的代码不简单怎么办?如何避免 ShapeEditorMoveCommand 中的代码重复?

This works well, but how can I display preview of movement (when user holds mouse button) and then only store final offset on mouse button release?

如果我对你的理解是正确的,你希望将整个动作作为单个操作不可执行/可重新执行,同时在第一次以交互方式完成时为每个单独的微动作设置动画。

一种方法是您自己建议的,即仅在移动完成时才记录撤消/重做命令。正如您所指出的,这会导致一些代码重复。在实践中这不是问题,因为您总是可以将通用代码分解出来。

另一种方法是为每个微移动创建一个 MoveCommand,然后将命令合并作为撤消/重做堆栈的一部分。看看怎么样done in Qt.