客户端在命令模式中做了什么?
What does the client do in Command Pattern?
我正在阅读 headfirst 设计模式这本书。
我观察到客户端显示类似于酒店客户,他创建了一个 order(command)
对象,waitress(invoker)
选择它并调用其 execute()
方法,该方法又调用厨师的 cook() method(chef=receiver)
在命令模式 class 图中,我可以看到客户端与 Receiver
以及 ConcreteCommand
class 相关联。我无法得到这个例子,因为在现实世界中,客户不应该知道厨师并为他设置说明。另一个问题是,在命令模式 class 图中,我观察到 Client 未显示与 Invoker 相关联,但在附加的 java 程序中,我可以在 Client class 中看到 Invoker 引用.
对客户端模块在命令模式中的作用完全感到困惑。清除其余4个模块。
所以客户端的概念和服务器的概念是相反的。 (为了获得餐厅的比喻一分钟)。服务器是集中式应用程序,客户端是呈现在用户机器上的界面。客户端机器或 GUI 信号通过接收器(中间人)或您的程序直接使事情发生。
我希望这能让事情更清楚一些。
读这个:http://www.oodesign.com/command-pattern.html
Client creates a ConcreteCommand object and sets its receiver [...] The Client asks for a command to be executed.
它甚至有显示客户端做什么的示例代码:
The client creates some orders for buying and selling stocks (ConcreteCommands). Then the orders are sent to the agent (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
}
}
您遇到了通过类比、单个具体示例或对象图来演示设计模式的挑战。除了非常简单的模式,概念和示例通常不会完美映射到模式的所有有用实例。
我强烈建议您选择多个来源来学习任何更复杂的设计模式。每个解释都会有优点和缺点,如果您考虑多种观点,您可能会得到更准确的图片。 Internet 上有大量免费资源,因此您可能不需要购买额外的书籍(最终 the original Design Patterns book 除外,以供参考)。
图表中不清楚的是 Client
、Invoker
和 Receiver
是抽象概念,并没有始终保持一致的单一形式适用于所有情况。在命令模式的任何特定实现中,这些角色中的大多数都将存在(可能 Receiver
除外 - 命令可能是独立的)。您甚至可以指出映射到每个角色的特定代码位,但它在每个应用程序中的映射都不同。它甚至可能在同一应用程序的不同部分进行不同的映射。
你分享的图表中有部分我有问题,因为它们并不总是正确的。 Client
可能无法直接访问甚至不知道 Receiver
。 Client
也可能不知道特定的 ConcreteCommand
对象。 Client
可能知道如何请求命令实例,并且它可能知道一些有助于选择正确命令的信息。但是,在某些情况下,客户端可能不知道执行了哪个 ConcreteCommand
对象,尤其是当您将命令模式与 the AbstractFactory
pattern.
结合使用时
in real world, a customer is not supposed to know about the cook and set the instructions for him
当您严格地将类比和模型与现实进行比较时,类比和模型往往会失效或变得混乱。最好弄清楚模型试图完成什么,以及模型试图解释的现实的可能解释。
此外,并非所有 models/analogies 都很好 :) 有时他们实际上并没有完成工作。
I observe that Client is not shown associated with Invoker
这在该模式的某些实现中完全有效。最终调用 execute()
的代码可能与能够接受操作的代码不同。
该图可能显示了一个盒子,但在餐厅类比中,服务员、厨师、服务员、主人、收银员等都是该 Invoker
角色的一部分。
图表的问题是客户端最终必须将命令传递给调用者。调用者本身可能有办法完成此操作,或者两者之间可能有某种系统(如命令队列)。无论哪种方式,在他们的解释中,调用者角色处理这两件事,因此客户必须知道调用者。
最后:
What does the client do in Command Pattern?
Client
负责知道它想要完成一个命令
-
Client
负责知道如何选择完成哪个命令,并获取它的实例(即使客户端将 ConcreteCommand
的实际构造委托给 ConcreteCommand
的其他部分系统)
-
Client
负责了解如何传递命令以便最终调用它(将它传递给 Invoker
角色中的某个对象,即使该命令最终被传递转到实际调用 execute()
) 的其他对象
-
Client
负责实际将命令传递给 Invoker
(无论是直接传递,还是先传递给系统的某个中间部分)
order(command)
对象,waitress(invoker)
选择它并调用其 execute()
方法,该方法又调用厨师的 cook() method(chef=receiver)
在命令模式 class 图中,我可以看到客户端与 Receiver
以及 ConcreteCommand
class 相关联。我无法得到这个例子,因为在现实世界中,客户不应该知道厨师并为他设置说明。另一个问题是,在命令模式 class 图中,我观察到 Client 未显示与 Invoker 相关联,但在附加的 java 程序中,我可以在 Client class 中看到 Invoker 引用.
对客户端模块在命令模式中的作用完全感到困惑。清除其余4个模块。
所以客户端的概念和服务器的概念是相反的。 (为了获得餐厅的比喻一分钟)。服务器是集中式应用程序,客户端是呈现在用户机器上的界面。客户端机器或 GUI 信号通过接收器(中间人)或您的程序直接使事情发生。
我希望这能让事情更清楚一些。
读这个:http://www.oodesign.com/command-pattern.html
Client creates a ConcreteCommand object and sets its receiver [...] The Client asks for a command to be executed.
它甚至有显示客户端做什么的示例代码:
The client creates some orders for buying and selling stocks (ConcreteCommands). Then the orders are sent to the agent (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 } }
您遇到了通过类比、单个具体示例或对象图来演示设计模式的挑战。除了非常简单的模式,概念和示例通常不会完美映射到模式的所有有用实例。
我强烈建议您选择多个来源来学习任何更复杂的设计模式。每个解释都会有优点和缺点,如果您考虑多种观点,您可能会得到更准确的图片。 Internet 上有大量免费资源,因此您可能不需要购买额外的书籍(最终 the original Design Patterns book 除外,以供参考)。
图表中不清楚的是 Client
、Invoker
和 Receiver
是抽象概念,并没有始终保持一致的单一形式适用于所有情况。在命令模式的任何特定实现中,这些角色中的大多数都将存在(可能 Receiver
除外 - 命令可能是独立的)。您甚至可以指出映射到每个角色的特定代码位,但它在每个应用程序中的映射都不同。它甚至可能在同一应用程序的不同部分进行不同的映射。
你分享的图表中有部分我有问题,因为它们并不总是正确的。 Client
可能无法直接访问甚至不知道 Receiver
。 Client
也可能不知道特定的 ConcreteCommand
对象。 Client
可能知道如何请求命令实例,并且它可能知道一些有助于选择正确命令的信息。但是,在某些情况下,客户端可能不知道执行了哪个 ConcreteCommand
对象,尤其是当您将命令模式与 the AbstractFactory
pattern.
in real world, a customer is not supposed to know about the cook and set the instructions for him
当您严格地将类比和模型与现实进行比较时,类比和模型往往会失效或变得混乱。最好弄清楚模型试图完成什么,以及模型试图解释的现实的可能解释。
此外,并非所有 models/analogies 都很好 :) 有时他们实际上并没有完成工作。
I observe that Client is not shown associated with Invoker
这在该模式的某些实现中完全有效。最终调用 execute()
的代码可能与能够接受操作的代码不同。
该图可能显示了一个盒子,但在餐厅类比中,服务员、厨师、服务员、主人、收银员等都是该 Invoker
角色的一部分。
图表的问题是客户端最终必须将命令传递给调用者。调用者本身可能有办法完成此操作,或者两者之间可能有某种系统(如命令队列)。无论哪种方式,在他们的解释中,调用者角色处理这两件事,因此客户必须知道调用者。
最后:
What does the client do in Command Pattern?
Client
负责知道它想要完成一个命令-
Client
负责知道如何选择完成哪个命令,并获取它的实例(即使客户端将ConcreteCommand
的实际构造委托给ConcreteCommand
的其他部分系统) -
Client
负责了解如何传递命令以便最终调用它(将它传递给Invoker
角色中的某个对象,即使该命令最终被传递转到实际调用execute()
) 的其他对象
-
Client
负责实际将命令传递给Invoker
(无论是直接传递,还是先传递给系统的某个中间部分)