【问题标题】:Command design pattern and user interaction命令设计模式和用户交互
【发布时间】:2014-08-26 16:42:22
【问题描述】:

我正在实现命令设计模式,但我的命令需要向用户询问文件名。我不确定命令如何要求它?

四本书的帮派似乎触及了这个问题,但我不太清楚。下面是我的代码(伪代码是正确的并且是即时编写的)。

class OpenDocumentCommand : public Command
{
    virtual char * AskUserForFileName();
    virtual void Execute();

    Application _App;
}

void OpenDocumentCommand::Execute()
{
   char * fileName = AskUserForFileName();

   _App.OpenDocument( fileName );
}

现在在典型的简单示例中,AskUserForFileName() 可以是 cincout,但它如何在适当的 Windows 应用程序中询问文件名?它应该打开文件资源管理器并且用户可以选择文件名?

这是否意味着它必须与windows紧密耦合?我的计划是在 Windows 和 iOS 上都使用此代码,所以我想要一个解耦的解决方案。

【问题讨论】:

  • 之前只需在单独的对话框中询问文件名,并将其作为参数传递给您的命令。
  • @πάνταῥεῖ 但这意味着一半的命令是在命令之外执行的。 command 的目标之一是稍后打包和执行命令。
  • 'to package' 这究竟是什么意思?恕我直言,命令应配置它们需要执行的所有参数,无需进一步交互。
  • '这是否意味着它必须与 windows 紧密耦合?'如果您想将 GUI 代码与命令分开,请使用 layers 模式 和表示层中的 GUI。这类似于 MVC 中的 View 和 Controller。

标签: c++ ios windows design-patterns command-pattern


【解决方案1】:

为了最大限度地减少命令和窗口之间的耦合,您至少应该在它们之间插入一个抽象层。在许多 MVVM 实现中,您可以找到一个“模态对话框”界面,它对调用 ViewModel 隐藏窗口的实现细节。

此接口至少包含一个方法“ShowDialog()”,但它也可以将 ViewModel 作为参数并返回回调以通知调用者何时被用户关闭。

这是一个例子:

public interface IModalWindow
2   {
3     bool? DialogResult { get; set; }
4     event EventHandler Closed;
5     void Show();
6     object DataContext { get; set; }
7     void Close();
8   }

【讨论】: