我对命令模式的理解是,您只需要一个虚拟方法'execute()',并且实现可能具有的所有依赖项都放在构造函数中或通过实现中的setter注入(如所讨论的{{3} })。
但是,在模式的WPF实现中,我注意到它们正在将泛型参数传递给execute()函数(解释为here)。
这似乎是对我的界面的污染,在execute()函数中添加泛型参数的动机是什么?
答案 0 :(得分:3)
规范命令模式通常用很好的自包含命令来说明。因为命令所需的任何信息都存储在Command对象实例中(通常通过参数化构造函数)。
但是在某些情况下,Execute所需的参数可能在命令创建时不可用(仅在运行时知道)。例如想象一下SignOutCommand( username )
。用户首先登录后点击SignOut按钮确定用户名。
因此,用户名作为通用参数传递给Command.Execute()
;每个命令都可以自由地定义其输入并相应地进行投射任意命令可以要求5个参数作为对象[]。
答案 1 :(得分:1)
用于数据绑定。例如,将命令绑定到列表中的每个对象时,会将当前实例发送到execute方法,这样您就不必自己跟踪当前实例。
那就是说,我认为WPF命令概念不是命令模式的实现,它们只是共享术语。
答案 2 :(得分:1)
该参数背后的原因是命令的创建者之间的隔离 - 谁知道需要执行的命令,以及调用者 - 当需要执行命令时,谁知道。
在某些命令中,创建者无法获得执行所需的一些信息。调用者通过传递参数来填充空白。示例:创建者创建一个命令,根据某些条件过滤记录列表。该列表在创建站点上不可用,因为应用程序中有多种列表。
调用者将通过传入at作为参数来指定需要过滤的列表。
答案 3 :(得分:1)
我们使用了一点改变的命令模式,因此除了Execute方法之外,我们还有两个属性Request和Response,我们使用多态来对它们进行参数化。
答案 4 :(得分:1)
出了什么问题:
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.
}
}
现在,如果您有一个收集参数的控制器,您可以将这些参数传递给您的命令。