c++ - 命令模式 : Where to create the Command items?

标签 c++ command-pattern

我已经相当广泛地使用了命令模式,并且效果很好。但是,通常不会讨论的是创建命令实例的位置。

以下示例说明了此问题:Document 具有设置文本的函数 setText():

class Document {
public:
    void setText(const std::string text) {
        if (commandManager()->isActive()) {
            // called by SetTextCommand
            m_text = text;
        } else {
            // called somewhere in the application
            commandManager()->addAndExecute(new SetTextCommand(this, text));
        }
    }
    std::string text() const { return m_text; }

    CommandManager * commandManager() const { return m_commandManager; }
private:
    std::string m_text;
    CommandManager * m_commandManager;
}

在这里,SetTextCommand 会像这样执行 document->setText(text):

class SetTextCommand : public Command {
public:
    SetTextCommand(Document * doc, const std::string & text)
        : Command(), m_doc(doc), m_oldText(doc->text()), m_text(text)
    {}
    void redo() override {
        m_doc->setText(m_text);
    }
    void undo() override {
        m_doc->setText(m_oldText, false);
    }
}

SetTextCommandCommandManager 像这样处理:

CommandManager::addAndExecute(Command * command) {
    m_doc->commandManager()->setActive(true); // THIS IS THE TRICK
    command->redo();
    m_doc->commandManager()->setActive(false);  // THIS IS THE TRICK
    m_stack->push_back(command);
}

这里的技巧是,当运行 redo() 时,CommandManager::isActive() 设置为 true。因此,Document::setText() 将设置 m_text

显然,所有 Document setter 函数都必须遵循 if (commandManager()->isActive()) { ... } else { ... } 范例。这是因为命令本身是在设置函数中创建的。

现在的问题是:这是实现命令模式的好方法吗?还是有更简洁的解决方案来创建命令,同时拥有良好的 API?

请详细回答你的问题。

最佳答案

我认为必须在各处复制 if (commandManager()->isActive()) 会很丑陋……如果有 setText 可能会更好始终执行 SetTextCommand 路径,并创建 SetTextCommand 可以使用的新的 setTextImmediate 方法。

关于c++ - 命令模式 : Where to create the Command items?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31808140/

相关文章:

C#:将复杂的对象列表传递给另一个类是否会占用大量内存

java - 命令模式 - 参数

c++ - 在目录中获取目录中的文件列表

c++ - 如何在 C++ 中将 operator= 与匿名对象一起使用?

c++ - 从 Winlogon 桌面切换到用户桌面

带有 Runnable 类 : Is Receiver missing? 的 java 命令模式示例

java - 为什么在 GWT(或任何网络应用程序)中使用命令模式?

c++ - C++ 中的动态与静态多态性 : which is preferable?

c++ - QT在QGraphicsScene上绘制富文本

java - 为什么我应该使用命令设计模式,而我可以轻松调用所需的方法?