代码之家  ›  专栏  ›  技术社区  ›  eli

命令模式与参数设计

  •  2
  • eli  · 技术社区  · 16 年前

    我对命令模式的理解是,您只需要有一个虚拟方法“execute()”,并且实现可能具有的所有依赖项都放在构造函数中或通过实现中的setter注入(如所讨论的 here )

    但是,在模式的WPF实现中,我注意到它们正在传递 通用的 execute()函数的参数(解释 here )

    对我来说,这似乎是界面的污染,是什么原因促使我添加一个 通用的 execute()函数的参数?

    5 回复  |  直到 16 年前
        1
  •  1
  •   Klaus Byskov Pedersen    16 年前

    用于数据绑定。例如,当您将命令绑定到列表中的每个对象时,当前实例将被发送到execute方法,这样您就不必自己跟踪当前实例。

    也就是说,我不认为wpf命令概念是命令模式的实现,它们只是共享术语。

        2
  •  3
  •   Gishu    16 年前

    规范的命令模式通常用良好的自包含命令来说明。其中,命令所需的任何信息都存储在命令对象实例中(通常通过参数化构造函数)。

    但是,在某些情况下,执行所需的参数可能在命令创建时不可用(仅在运行时已知)。想象一下 SignOutCommand( username ) . 用户名是在用户首次登录后单击“注销”按钮时确定的。

    所以用户名作为通用参数传递给 Command.Execute() ;每个命令都可以自由定义其输入并相应地强制转换,例如,任意命令可能需要5个参数作为对象[]。

        3
  •  1
  •   Itay Maman    16 年前

    该参数背后的原因是 造物主 指挥部-谁知道 什么 需要执行命令,并且 呼叫者 -谁知道 什么时候? 需要执行命令。

    在某些命令中,创建者无法获得执行所需的某些信息。调用方通过传递一个参数来填充空白。例如:创建者创建一个命令,根据某些条件筛选记录列表。该列表在创建站点上不可用,因为应用程序中有多种列表。

    调用者将通过作为参数传递来指定需要筛选的列表。

        4
  •  1
  •   Fedor Hajdu    16 年前

    我们使用一个有点变化的命令模式,这样除了执行方法之外,我们还有两个属性请求和响应,并且我们使用多态性对它们进行参数化。

        5
  •  1
  •   David Robbins    16 年前

    怎么了:

    public class DeleteCommand : BaseCommand
    {
      private Dictionary<string, object> parameters;
    
      public DeleteCommand(Dictionary<string, object> parameters)
      {
         this.parameters = parameters;
      }
    
      public void Execute()
      {
         var person = (Person)parameters["Person"];
         var salary = System.Convert.ToDouble(parameters["Salary"]);
    
         // etc.
      }
    }
    

    现在,如果您有一个控制器来收集参数,那么您可以将这些参数传递给您的命令。