将命令模式类比到日常生活中,可以想象一个餐厅的运作过程。在这个类比中,顾客点菜的过程就像是发出一个命令,而厨师则是执行命令的接收者。
角色类比
- 顾客(Client):下达命令。他们决定要什么菜,并通知服务员。
- 服务员(Invoker):接收命令,并传递给厨师。服务员不需要知道菜怎么做,他们只负责确保命令被正确记录并传达给厨师。
- 命令单(Command):服务员记录顾客点的菜的纸条或电子设备。每个命令单都会详细说明所需的菜品和顾客的特殊要求。
- 厨师(Receiver):执行命令。他们根据命令单上的内容准备菜品。
- 菜品(Action):命令的结果,也就是厨师根据命令单准备的食物。
过程类比
想象你走进一家餐厅,坐下后开始点菜(这是你发出的命令)。服务员(Invoker)将你的选择写在命令单上或输入到电子系统中。这个命令单就是一个具体的命令(ConcreteCommand),它包含了所有必要的信息,以便厨师(Receiver)能够准备菜品。
当服务员将命令传递给厨房后,厨师开始根据命令单上的指示准备食物。在这个过程中,即使服务员不在厨房,厨师也能独立完成任务,因为他们有明确的指示。
在某些情况下,顾客可能会改变主意,比如取消或更改订单。如果命令尚未执行,服务员可以简单地撤销或修改命令单上的内容,这类似于命令模式中的撤销(undo)操作。
基于餐厅类比的命令模式,我们可以将其转换成代码。以下是一个简化的Java示例,展示了如何实现命令模式:
// Command接口
public interface OrderCommand {void execute();
}// ConcreteCommand:制作汉堡的命令
public class BurgerOrder implements OrderCommand {private Chef chef;public BurgerOrder(Chef chef) {this.chef = chef