命令设计模式 - Invoker是否可选?

时间:2012-10-14 05:40:05

标签: design-patterns command-pattern

在命令设计模式中,Invoker类是可选的吗?客户端需要为命令实例化Concrete Command和Receiver。客户端是否总是需要实例化Invoker并将命令对象传递给Invoker对象。稍后,只要客户端需要执行命令,客户端就会询问Invoker对象,并且Invoker执行命令(可能会立即或者可能将命令排队等待以后执行)。

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

2 个答案:

答案 0 :(得分:6)

命令模式的目的通常是1)使一组不同的操作共享相同的类型,以便它们可以由相同的代码处理2)从操作调用中单独的操作编组/创建。出于目的2明确要求接收者。

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

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

编辑:我认为单一责任原则认为你应该将它们分开,但是存在这样的事情:commen sense :)本地条件可以而且应该被观察到。

答案 1 :(得分:1)

正如我们所知,java.lang.Runnable是命令模式的一个例子,其中Thread类作为一个调用者。我们将Runnable类的对象传递给Thread类,然后说start / run。

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

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

另一个answer与此问题有关。