design-patterns - 命令模式是命令的单个实例

标签 design-patterns command-pattern

命令模式的定义是否表明该命令是否应该可重用。我的意思是,您是否应该在每次想要调用执行方法时创建一个新实例,或者您可以创建该命令的单个实例并使用不同的参数多次调用执行吗?

在 .net 平台上,我可以看到 WPF 中的命令仅创建一次,但不确定这就是答案。

也许另一种看待它的方式是,不允许命令保持状态,例如 ddd-service,如果是这样,那么拥有单个实例就可以了。

如果这不是模式定义的一部分,是否存在任何“最佳实践”?

最佳答案

GoF 模式中的命令对象肯定是可重用的。最常见的重用情况是支持撤消操作的命令。调用者可以调用 execute() 来执行操作,然后调用 undo() 来回滚该操作。调用者可以随意execute()undo()无数次。

对于该模式至关重要的是,调用者不知道命令如何执行,包括执行(或撤消)所需的任何参数。参数必须封装在 Command 对象中,这意味着它们可以在 Command 实例化时传递,但不能在执行时传递。

很明显,调用者永远不会实例化命令本身,因为重点是通过提供一个正常工作的黑盒来将调用者与执行细节分离。有关该主题的更多信息,请参见:https://stackoverflow.com/a/52877064/1371329 .

are you supposed to create a new instance every time you want to call the execute-method

不,只有当您希望使用不同的参数调用 execute() 方法时,您才应该创建一个新实例。命令将这些参数保存为其状态,以便调用者不必了解它们。

将其想象为单击按钮。您无法将参数传递给按钮。该按钮执行的操作可能在 UI 后面带有参数,但您无需传递任何内容即可单击该按钮。你是祈求者。该按钮是命令。创建按钮并通过某些操作对其进行参数化的 UI 是客户端。客户端通过命令接口(interface)将调用者与操作解耦。

关于design-patterns - 命令模式是命令的单个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61747238/

相关文章:

c# - wpf MvvM 命令数据上下文问题

java - OOP中的设计建议

language-agnostic - Model View Controller

c# - 结构图 : concrete class at run time

ruby-on-rails - 如何在 Ruby on Rails 中使用子 Controller ?

c# - 命令模式 - 文本框问题中的撤消功能

design-patterns - 将命令与其处理程序分离

model-view-controller - MVC 模式中的 Controller 和 MVP 模式中的演示者有什么区别?

java - 如何像在 C++ 中一样在 Java 中使用命令模式?

domain-driven-design - 如何为在一个上下文中是聚合根但在另一上下文中不是聚合根的实体编写命令?