我正在阅读头脑设计模式书。
我观察到客户端显示的类似于酒店客户,他创建了一个order(command)
对象,waitress(invoker)
选择了该对象并调用其execute()
方法,而该方法又称为主厨#{1}} cook() method(chef=receiver)
在命令模式类图中,我可以看到客户端与Receiver
以及ConcreteCommand
类相关联。我无法得到这个例子,因为在现实世界中,顾客不应该知道厨师并为他设定说明。另一个问题是在命令模式类图中,我观察到Client没有显示与Invoker关联,但是在附加的java程序中,我可以在Client类中看到Invoker引用。
完全混淆了Client模块在命令模式中的作用。清除其余4个模块。
答案 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 } }
答案 1 :(得分:1)
通过类比,单个具体示例或对象图展示设计模式,您偶然发现了挑战。除了非常简单的模式之外,概念和示例通常不能完美地映射到模式的所有有用实例。
我强烈建议您选择几个来源来学习任何更复杂的设计模式。每个解释都有优点和缺点,如果考虑多个观点,你可能会得到更准确的图片。互联网上有大量的免费资源,因此您可能不需要购买额外的图书(最终除the original Design Patterns book外),以供参考。
图中不清楚的是Client
,Invoker
和Receiver
是抽象概念,并且没有始终适用的单一表单每个案例。在命令模式的任何特定实现中,大多数这些角色都将存在(除了Receiver
之外 - 命令可能是自包含的)。您甚至可以指出映射到每个角色的特定代码,但它将在每个应用程序中以不同方式映射。它甚至可以在同一应用程序的不同部分中进行不同的映射。
您分享的图表中有部分我遇到了问题,因为它们并非总是如此。 Client
可能无法直接访问甚至了解Receiver
。 Client
可能也不知道特定的ConcreteCommand
个对象。 Client
可能知道如何请求命令的实例,并且它可能知道一些有助于选择正确命令的信息。但是,在某些情况下,客户端可能会忘记执行了ConcreteCommand
个对象,尤其是在将命令模式与the AbstractFactory
pattern结合使用时。
在现实世界中,顾客不应该知道厨师并为他设定指示
当您将它们严格地与现实进行比较时,类比和模型往往会崩溃或变得混乱。最好试着找出模型试图完成的内容,以及该模型试图解释的对现实的可能解释。
此外,并非所有的模特/类比都是好的:)有时他们实际上并没有完成任务。
我发现客户端未显示与Invoker相关联
这在模式的某些实现中非常有效。最终调用execute()
的代码可能与能够接受操作的代码不同。
图表可能会显示一个方框,但在餐馆类比中,服务员,厨师,公交车,主人,收银员等都是Invoker
角色的一部分。
图中的问题是客户端最终必须将命令传递给调用者。调用者本身可能有办法完成此任务,或者中间可能存在某种系统(如命令队列)。无论哪种方式,在他们的解释中,调用者角色处理这两件事,因此客户必须知道调用者。
最后:
客户端在命令模式中做了什么?
Client
负责知道它想要完成命令Client
负责知道如何选择完成哪个命令,并获取它的实例(即使客户端将ConcreteCommand
的实际构造委托给系统的其他部分)Client
负责知道如何传递命令以便最终调用它(将其传递给Invoker
角色中的某个对象,即使该命令最终被传递给实际调用execute()
)Client
负责将命令实际交给Invoker
(无论是直接交还,还是首先传递给系统的某个中间部分)答案 2 :(得分:0)
因此,客户的想法与服务器的想法相反。 (让餐馆比喻一分钟)。服务器是集中式应用程序,客户端是用户计算机上显示的接口。客户端机器或GUI信号直接关闭接收器(中间人)或程序以使事情发生。
我希望这会让事情变得更加清晰。