0

命令模式具有三个主要组件:调用者、命令接收者。Client 向Invoker提供调用ReceiverM上 的特定方法所需的信息,而实际调用的是Command对象(由Receiver提供)。M

a) 为了实现CP,我们必须将Invoker 的逻辑与命令的数量分离,这样当我们增加命令的数量时,Invoker类就不必改变。我们通过让Command对象和Invoker依赖于抽象(即接口)来做到这一点。

因此,CP不只是DIP的特定实现吗?

b) 如果CP确实是DIP的实现,那么CP与其他类型的DIP实现究竟有什么不同?也就是说,我们不能说所有其他的DIP实现也有Invoker对象(即更高级别的模块)、Command对象(即为更高级别的模块提供行为的依赖项),而 Receiver 将被视为依赖对象的任何方法(即较低级别的模块)调用?

谢谢你


编辑:

一个)

依赖对象将依赖项保持为一个字段,并将其用于所有后续方法调用。

如果依赖对象不将此依赖项保留为字段,因此它不会将其用于所有后续调用,而是始终接收新的依赖项对象,那么我们是否可以争辩说我们有一个CP而不是DI

反之亦然——如果 Invoker 总是调用相同的命令对象,那么我们是否可以争辩说我们有DI而不是CP,而不管实际执行的工作命令对象是什么?

b)我理解你试图表达的观点,但我仍然在区分什么是行为和什么是命令时遇到了一些重大问题。在我看来,将命令传递给 Invoker 也可以解释为注入依赖对象完成其工作所需的行为。是真的那么明确还是更主观?因此,我们如何判断一个对象所做的工作是命令还是行为?

4

1 回答 1

1

命令模式不会向对象注入任何内容。它将命令传递给调用命令的方法(通常只调用一次)。

依赖注入注入一个依赖(即依赖对象完成其工作所需的另一个对象)。依赖对象将依赖项保持为一个字段,并将其用于所有后续方法调用。

如果你想打个比方,依赖注入就是给厨师一个烤箱,让他准备所有的菜。命令模式包括每次有人要菜时给他一碗食材准备。

编辑:

命令模式包括传递抽象类的某个接口的实现,该接口只定义了一个方法(execute())。调用者在不知道它可以做什么或它的角色是什么的情况下调用这个命令。该模式的原理是能够传递命令接口的几种不同实现(例如,上、右、左)。调用者可能会存储这些实例以便稍后执行它们,或者存储它们以撤消它们。

依赖注入只是在依赖对象初始化时传递一个依赖。这种依赖关系提供了大量识别良好的方法,这些方法被依赖对象用作其自身业务逻辑的一部分。

两者都使用对象和调用方法,但目标却大不相同。

所以我对你的观点 a) 的回答是:是或否,这取决于。如果该对象是提供不同方法的通用对象,并且它不是仅具有一种方法的单个接口的许多实现之一,则依赖对象根据需要调用它,则它不构成命令。

b) 阅读http://en.wikipedia.org/wiki/Command_pattern中的示例代码,它应该更清楚。

于 2012-07-06T21:19:59.800 回答