命令模式似乎不必要地复杂(我无法理解什么?)

|| 我已经阅读了命令模式,我想我缺少了一些东西。 Command对象的存在是为了抽象出Receiver对象的详细信息。在我看来,我们可以简单地在这里停止,并保留对Command对象的引用,以在适当的时间执行适当的方法。 那么,为什么需要调用者?这个额外的间接提供了什么好处?我们已经在Command后面隐藏了Receiver的详细信息,那么将Command隐藏在客户端的动机又是什么呢?     
已邀请:
好吧,如果您这样说的话,它似乎相当复杂,但是通常Receiver根本不需要成为对象。它不仅仅可以是一个已执行的功能(作为事件)。另外,调用者不必是类。只是触发命令的事物。这也可以是按钮中的事件处理程序。 甚至Wikipedia都总结了几个使用这种模式的示例,而实际上不必为调用者和接收者实现完整的单独类。一个示例是向导对话框,其中GUI填充命令对象,然后单击“完成”按钮将其触发。这样,GUI类(无论如何您都拥有)既是客户端又是调用者。     
如果要传递不同类型的命令,则“ 0”很有用。您可以使用同一调用程序来执行不同的具体命令。在另一个节点上,用
ConcreteCommand
标记
Receiver
而不是
Invoker
允许松散耦合。
Receiver
可以更改方法的名称(例如,将switchOn更改为swithcOnTV),如以下示例所示: 相关文章:使用命令设计模式 为了了解ѭ0的目的,我希望您参考“餐厅和汽车服务中心”用例中的这篇文章。 服务员(
Invoker
)从他垫子上的
Customer
下订单。然后将ѭ8d排队等待订单厨师,然后到达进行加工的厨师(
Receiver
)。 客户是“ 7”。他通过服务员“ 0”将请求发送给“ 1”。服务员通过将命令(在本例中为订单)封装在支票上,然后将其放置,从而创建“ 2”对象(即命令本身)来封装该命令。
Receiver
将是厨师,在完成有关命令之前发送给他的所有命令的工作之后,便开始工作。 该示例的另一个值得注意的方面是,订单的便笺簿不只支持菜单中的订单,因此它可以支持烹饪许多不同项目的命令。     
据我所知,模式的全部目的是拥有某种命令生产者和某种命令使用者,但允许生产者在不改变使用者的情况下创建或修改命令。 该模式将生产者称为\“ Client \”,将消费者称为\“ Invoker \”。 这是一个面向对象的回调。   那么为什么需要调用者 据我从Wikipedia上的所有示例可以看出,调用者没有确定的形式。只是一些接受抽象命令的代码。   在我看来,我们可以简单地在这里停止,并保留对Command对象的引用 如果在代码中对于调用命令以接受或保留对抽象命令的引用的事物有意义,那么您已经实现了调用程序。 如果生产者和消费者都只有一点点代码,那么命令模式就毫无价值。仅当您将抽象命令传递给想要调用它们的东西时才值得。     
  我们已经在命令后面隐藏了接收方的详细信息, 没错,但是谁隐藏了这些细节,又隐藏了谁呢? 答案是,实例化Command实现的任何人都在进行隐藏,而调用Command抽象的人则被隐藏。显然,由一个对象执行这两个动作是没有任何意义的,而不仅仅是您可以对自己隐藏某些东西。 因此,
Client
实例化a2ѭ并将其传递给the0ѭ,后者仅了解only18ѭ接口。实际上,客户端为调用程序执行依赖项注入。 另请注意,有多种方法可以实现ConcreteCommand(请参阅https://stackoverflow.com/a/35617012/1371329)。如果ConcreteCommand具有某种机制来动态发现其自己的Receiver,则可能不需要依赖注入。     

要回复问题请先登录注册