餐厅用例

时间:2016-10-19 01:38:54

标签: oop design-patterns command-pattern

我刚开始学习设计模式,一个是命令模式。阅读了一些材料和一些文件后,例如

http://www.oodesign.com/command-pattern.html https://www.tutorialspoint.com/design_pattern/command_pattern.htm

我有了使用命令模式进行股票买卖的想法。客户可以首先决定他/她想要出售或购买哪种股票,然后让代理/经纪人调用该命令的执行功能。我认为这是有道理的。

另一个经典'例如餐厅,这让我困惑了很长一段时间。作为客户,客户如何知道哪个厨师(接收器)能够烹饪该物品(示例中的汤或烤架)?厨师不应该由客户决定。任何人都可以指出我应该如何处理这个想法吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

我相信你没有正确考虑餐馆的例子。顾客不直接向厨师下达订单,女服务员将订单送到厨房并将其放入队列中,厨师可以在他们有空的时候下订单。

在代码中,这看起来像女服务员添加的共享队列,并且厨师处于连续循环中,他们在那里做饭,然后接受他们能够烹饪的下一个订单。此示例中的命令模式只是从客户传输到厨房的顺序。

答案 1 :(得分:1)

实际上,您的问题超出了命令模式实际尝试解决的问题的范围。

如果您熟悉Java,则可以轻松了解Java线程中的Command模式。实际上Thread.run()(不仅仅是run())简而言之就是命令模式。

主要思想是,如果我们有一些具有重要功能的对象组(扩展Command接口的具体Command对象),则使用一种对任何方法参数或类型都不严格的方法来实现。因此,任何想要执行该功能的调用者(CommandHandler)都可以在不知道具体类是什么的情况下实际执行该函数。它可以执行someCommandObject.execute();。只有要求是Command接口的实例。

在Java线程示例中,让我们考虑一下JVM /操作系统。您知道任何程序都作为一个线程进入该级别,执行中的程序作为该线程的进程驻留在该线程中。因此,线程执行程序可以通过anyThread.start()anyThread.sleep()等执行任何线程处理。

在餐馆示例中,实际的命令对象是SoupOrderGrillOrder等.CommandHandler是Waiter。考虑一下我们引入另一个名为LunchOrder的命令对象的情况,该对象是Command类的子类并实现void execute(){}。现在您不必对调用者(Waiter)进行任何更改,因为它仍然可以调用lunchOrder.execute()。因此,发布者(命令对象)和客户端(调用者)实现是分离的。这就是Command模式的美妙。

您也可以参考this。 :))