Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 指挥模式及;参数设计_Wpf_Design Patterns_Command Pattern - Fatal编程技术网

Wpf 指挥模式及;参数设计

Wpf 指挥模式及;参数设计,wpf,design-patterns,command-pattern,Wpf,Design Patterns,Command Pattern,我对命令模式的理解是,您只需要有一个虚拟方法“execute()”,实现可能具有的所有依赖项都放在构造函数中,或者通过setter注入到实现中(如前所述) 但是,在该模式的WPF实现中,我注意到它们正在向execute()函数传递一个泛型参数(已解释) 对我来说,这似乎是对接口的污染,在execute()函数中添加泛型参数的动机是什么?它是用于数据绑定的。例如,当您将命令绑定到列表中的每个对象时,当前实例将被发送到execute方法,这样您就不必自己跟踪当前实例 也就是说,我不认为WPF命令概念

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

但是,在该模式的WPF实现中,我注意到它们正在向execute()函数传递一个泛型参数(已解释)


对我来说,这似乎是对接口的污染,在execute()函数中添加泛型参数的动机是什么?

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


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

该参数背后的原因是命令的创建者之间的隔离,他们知道需要执行什么命令,调用方知道何时需要执行命令

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


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

我们使用稍微改变的命令模式,因此,除了Execute方法外,我们还有两个属性Request和Response,并使用多态性对它们进行参数化。

规范的命令模式通常用漂亮的自包含命令来说明。命令所需的任何信息都隐藏在命令对象实例中(通常通过参数化构造函数)

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

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

有什么问题:

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.
  }
}
公共类DeleteCommand:BaseCommand
{
私有字典参数;
公共删除命令(字典参数)
{
此参数=参数;
}
public void Execute()
{
var person=(person)参数[“person”];
var salary=System.Convert.ToDouble(参数[“salary”]);
//等等。
}
}

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

在您的示例中,我希望为处理列表的命令提供一个特定的接口,该接口将列表(或列表的接口)作为参数,而不是某种通用参数。@eli.work:我没有说参数需要是通用的。我刚才说,在创建命令对象的站点上,执行所需的数据并不总是可用的。我的问题应该更清楚一点:我想知道的是泛型参数的动机。我会更新我的问题,谢谢你的回复!我明白了,但是为什么不定义一个单独的接口,或者创建一个从其他地方获取用户名的命令实现(比如IUserNameGetter)?@eli.work我想这是简单和优雅之间的折衷。使用IUserNameGetter,您必须创建此新类型的实例并将其存储在命令对象中。每次执行调用时,命令对象都会再次发送一条消息,从GUI检索用户名。比仅仅传递输入更健谈。另外,由于WPF限制从创建GUI的线程访问GUI,您可能需要在IUserNameGetter impl中执行线程验证和切换(例如,如果在工作线程上调用Command.Execute)。我在编写的测试自动化框架中使用了类似的方法,尽管我正在将字典传递给Execute方法,以便操作对象可以保持无状态,因此可以缓存。