10

命令设计模式中的调用者类是可选的吗?客户端需要为命令实例化具体命令和接收器。客户端是否总是需要实例化 Invoker 并将命令对象传递给 Invoker 对象。稍后,每当客户端需要执行命令时,客户端只需询问 Invoker 对象,Invoker 就会执行命令(可能立即执行,也可能将命令排队等待稍后执行)。

或者这是相反的方式?如果客户端需要同步执行命令,客户端将使用基类接口引用命令,但会实例化具体的命令和接收器。每当客户端需要执行命令时,客户端只会调用基类命令变量的执行方法?当需要一些额外的逻辑来执行命令时,Invoker 类将用于保留该额外的逻辑,并且客户端将与 Invoker 对象交互以执行命令?

4

2 回答 2

6

命令模式的目的通常是 1) 使一组不同的操作共享相同的类型,以便它们可以由相同的代码处理 2) 将操作编组/创建与操作调用分开。目的 2 明确需要接收器。

如果您在创建后立即调用,或者如果 Reciever 扮演调用者的角色,则不存在单一用途、独立的调用者。这是否意味着没有调用者真的是一个哲学问题:)

这样看:你/可以/分开创建、调度和调用。这并不意味着您必须将它们实现为三个独立的类。它只是涉及命令模式生命周期的逻辑角色。

编辑:我猜单一责任原则认为你应该将它们分开,但有一种常识:)可以而且应该遵守当地条件。

于 2012-10-15T07:10:16.273 回答
1

众所周知,java.lang.Runnable 是 Thread 类作为调用者工作的命令模式的示例之一。我们将 Runnable 类的对象传递给 Thread 类并说启动/运行。

但是我们从不创建可以调用主线程的客户端类。

所以调用者不是可选的,但它与客户端没有紧密耦合。因此,命令模式的 UML 从不显示客户端类和调用者类之间的任何关系。

与此问题相关的另一个答案

于 2013-05-04T17:33:35.187 回答