命令模式:在哪里创建命令项
Command Pattern: Where to create the Command items?
我已经广泛地使用了命令模式,它工作得很好。然而,通常不讨论的是,其中是创建命令实例的地方。
下面的例子说明了这个问题: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);
}
}
SetTextCommand
被CommandManager
处理如下:
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 { ... }
范式。这是因为命令本身是在setter函数中创建的。
现在的问题是:这是实现命令模式的好方法吗?或者是否有更简洁的解决方案来创建命令,同时拥有一个漂亮的API?
请详细回答。
我认为到处复制if (commandManager()->isActive())
是非常丑陋的…也许让setText
总是做SetTextCommand
路径更好,并创建一个SetTextCommand
可以使用的新的setTextImmediate
方法。
相关文章:
- 在命令行中创建快捷命令
- make 命令创建 .file,但不创建应用程序文件
- 如何使用 c++ 在命令行中创建一个简单的字符控制器?
- 如何在 C++11 中创建具有命令行参数大小的动态数组?
- 创建在选定目录中打开的命令提示过程
- 第二次创建命令缓冲器时,在VKCMDDrawIndex中进行了segfault
- 使用 QT 创建器通过树莓派上的 Wifi 执行简单的终端命令
- 创建进程命令行参数
- 从命令行创建通用对象
- 如何创建一个 void 数组,其大小将由用户从命令行输入指定
- 使用创建进程函数创建"dir"命令失败,错误代码为 2
- 使用boost.program_options创建一个前缀命令
- 如何在C 程序中创建终端命令
- 在命令上创建或删除GDI形状
- 从命令行创建Intellisense数据库
- 如何以编程方式区分由 subst 命令创建的虚拟驱动器和实际的可移动驱动器
- CMake:如何使用make命令创建文件
- 如何在vc++中使用netstat命令创建程序
- 如何使用#import命令创建一个IDiaDataSource实例
- 使用HEX定义用ESC命令创建字符串