回答
这是数据绑定。例如,当您将命令绑定到列表中的每个对象时,当前实例将被发送到execute方法,以便您不必亲自跟踪当前实例。
这就是说,我不认为WPF命令的概念是命令模式的实现,他们只是分享术语。
该参数背后的原因是命令的创作者之间的隔离 - 在呼叫者谁知道要执行命令需要什么, - 谁知道当命令需要执行。
在某些命令中,执行所需的某些信息对于创建者不可用。调用者通过传递一个参数来填充空白。示例:创建者创建一个命令,根据某些条件过滤记录列表。该列表在创建站点不可用,因为应用程序中有许多种列表。
调用者将指定哪个列表需要通过作为参数传递来过滤。
我们使用了一点变化的命令模式,因此除了Execute方法之外,我们还有两个属性Request和Response,并且我们使用多态性对它们进行参数化。
典型的命令模式通常用很好的自包含命令来说明。因为该命令所需的任何信息都隐藏在Command对象实例内(通常通过参数化构造函数)。
但是在某些情况下,Execute所需的参数在命令创建时可能不可用(仅在运行时才可知)。例如想象一下SignOutCommand(username)
。用户名是在用户首次登录后单击SignOut按钮时确定的。
因此,用户名作为通用参数传递到Command.Execute()
;每个命令可自由定义其输入并相应地投射一个任意的命令可能需要5个参数作为对象[]。
我明白了,但为什么不定义一个单独的接口,或者创建一个从其他地方获取用户名的命令实现(如IUserNameGetter)? – eli 2010-01-29 10:33:18
@ eli.work这是一种我认为简单与优雅之间的折衷。使用IUserNameGetter,您必须创建此新类型的实例并将其存储在Command对象中。每次执行调用时,命令对象都会再次发送消息以从GUI中检索用户名。比传入输入更加健谈。此外,WPF限制从创建它的线程访问GUI,您可能需要在IUserNameGetter impl中执行线程验证和切换(例如,如果在工作线程上调用Command.Execute)。 – Gishu 2010-01-29 11:03:11
出了什么问题:
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.
}
}
现在,如果你有一个控制器,它收集的参数可以把它们通过对你的命令。
我在我编写的测试自动化框架中使用了类似的方法,但我将Dictionary传递给Execute方法,以便Action对象可以保持无状态并因此被缓存。 – 2010-11-18 23:27:34
- 1. 命令模式设计
- 2. 如何设计/执行命令模式时,命令可变数量的参数?
- 3. 使用命令设计模式将命令行参数转换为对象
- 4. 处理命令行参数的设计模式是什么
- 5. 命令模式 - 参数
- 6. c#命令模式设计问题
- 7. 开关设计模式命令java
- 8. 无关命令的命令设计模式
- 9. 使用命令设计模式添加新命令
- 10. 命令行参数的可靠模式
- 11. 将参数传递给命令模式
- 12. 设计模式 - 客户端服务器 - 命令模式
- 13. 不同模式的命令处理器的设计模式
- 14. 设计师模式混合状态和命令?
- 15. 命令和CommandParameter设计
- 16. 观察者和命令设计模式,为什么菜单通常使用命令模式?
- 17. 设计模式:模块化命令体系结构(工作流?)
- 18. C++协变参数 - 设计模式
- 19. 命令行参数和命令行参数数组的长度
- 20. MVVM模式和Silverlight命令
- 21. AsynchTask和命令模式?
- 22. MVC和命令模式
- 23. spawnl和模式命令
- 24. 命令行参数的计数为C
- 25. Powershell命令行参数和' - '
- 26. QtCreator和命令行参数
- 27. WPF命令和参数
- 28. Java和命令行参数
- 29. Optarg和命令行参数
- 30. Flask CLI命令和参数
在你的例子中,我希望有一个特定的接口用于在列表上工作的命令,它将列表(或列表的接口)作为参数,而不是某种通用参数。 – eli 2010-01-29 10:18:44
@ eli.work:我没有说参数需要通用。我刚才说过,执行所需的数据并不总是在创建命令对象的站点上可用的。 – 2010-01-29 10:55:59
我的问题应该更清楚一点:它是我想知道的泛型参数的动机。我会更新我的问题,并感谢您的回复! – eli 2010-01-29 11:00:13