客户端在命令模式中做了什么?

时间:2016-06-12 11:21:44

标签: java oop object-oriented-analysis

enter image description here我正在阅读头脑设计模式书。 我观察到客户端显示的类似于酒店客户,他创建了一个order(command)对象,waitress(invoker)选择了该对象并调用其execute()方法,而该方法又称为主厨#{1}} cook() method(chef=receiver) 在命令模式类图中,我可以看到客户端与Receiver以及ConcreteCommand类相关联。我无法得到这个例子,因为在现实世界中,顾客不应该知道厨师并为他设定说明。另一个问题是在命令模式类图中,我观察到Client没有显示与Invoker关联,但是在附加的java程序中,我可以在Client类中看到Invoker引用。 完全混淆了Client模块在命令模式中的作用。清除其余4个模块。

3 个答案:

答案 0 :(得分:2)

阅读本文:http://www.oodesign.com/command-pattern.html

  

客户端创建一个ConcreteCommand对象并设置其接收器[...]客户端要求执行命令。

它甚至还有示例代码,显示客户端所做的

  

客户创建一些买卖股票的订单(ConcreteCommands)。然后将订单发送给代理商(Invoker)。 [...]

public class Client {
    public static void main(String[] args) {
        StockTrade stock = new StockTrade();
        BuyStockOrder bsc = new BuyStockOrder (stock);
        SellStockOrder ssc = new SellStockOrder (stock);
        Agent agent = new Agent();

        agent.placeOrder(bsc); // Buy Shares
        agent.placeOrder(ssc); // Sell Shares
    }
}
     

picture

答案 1 :(得分:1)

通过类比,单个具体示例或对象图展示设计模式,您偶然发现了挑战。除了非常简单的模式之外,概念和示例通常不能完美地映射到模式的所有有用实例。

我强烈建议您选择几个来源来学习任何更复杂的设计模式。每个解释都有优点和缺点,如果考虑多个观点,你可能会得到更准确的图片。互联网上有大量的免费资源,因此您可能不需要购买额外的图书(最终除the original Design Patterns book外),以供参考。

图中不清楚的是ClientInvokerReceiver是抽象概念,并且没有始终适用的单一表单每个案例。在命令模式的任何特定实现中,大多数这些角色都将存在(除了Receiver之外 - 命令可能是自包含的)。您甚至可以指出映射到每个角色的特定代码,但它将在每个应用程序中以不同方式映射。它甚至可以在同一应用程序的不同部分中进行不同的映射。

您分享的图表中有部分我遇到了问题,因为它们并非总是如此。 Client可能无法直接访问甚至了解ReceiverClient可能也不知道特定的ConcreteCommand个对象。 Client可能知道如何请求命令的实例,并且它可能知道一些有助于选择正确命令的信息。但是,在某些情况下,客户端可能会忘记执行了ConcreteCommand个对象,尤其是在将命令模式与the AbstractFactory pattern结合使用时。

  

在现实世界中,顾客不应该知道厨师并为他设定指示

当您将它们严格地与现实进行比较时,类比和模型往往会崩溃或变得混乱。最好试着找出模型试图完成的内容,以及该模型试图解释的对现实的可能解释。

此外,并非所有的模特/类比都是好的:)有时他们实际上并没有完成任务。

  

我发现客户端未显示与Invoker相关联

这在模式的某些实现中非常有效。最终调用execute()的代码可能与能够接受操作的代码不同。

图表可能会显示一个方框,但在餐馆类比中,服务员,厨师,公交车,主人,收银员等都是Invoker角色的一部分。

图中的问题是客户端最终必须将命令传递给调用者。调用者本身可能有办法完成此任务,或者中间可能存在某种系统(如命令队列)。无论哪种方式,在他们的解释中,调用者角色处理这两件事,因此客户必须知道调用者。

最后:

  

客户端在命令模式中做了什么?

  • Client负责知道它想要完成命令
  • Client负责知道如何选择完成哪个命令,并获取它的实例(即使客户端将ConcreteCommand的实际构造委托给系统的其他部分)
  • Client负责知道如何传递命令以便最终调用它(将其传递给Invoker角色中的某个对象,即使该命令最终被传递给实际调用execute()
  • 的其他一些对象
  • Client负责将命令实际交给Invoker(无论是直接交还,还是首先传递给系统的某个中间部分)

答案 2 :(得分:0)

因此,客户的想法与服务器的想法相反。 (让餐馆比喻一分钟)。服务器是集中式应用程序,客户端是用户计算机上显示的接口。客户端机器或GUI信号直接关闭接收器(中间人)或程序以使事情发生。

我希望这会让事情变得更加清晰。