在 Java 中使用命令模式来模拟餐厅下单吃饭的过程,可以通过以下步骤来实现:
创建命令接口:所有的命令都需要实现一个命令接口,包含一个
execute()方法。创建具体的命令类:每个具体的命令(比如下单、撤销订单)都需要实现命令接口。
创建接收者类:这些类是命令的实际执行者(如餐厅的服务员、厨师等)。
创建命令调用者类:负责调度命令并保存命令以支持撤销功能。
以下是一个简单的实现:
1. 创建命令接口
public interface Command { void execute(); // 执行命令 void undo(); // 撤销命令 }2. 创建接收者类(如餐厅服务员、厨师等)
// 服务员类 public class Waiter { public void takeOrder(String order) { System.out.println("服务员:接到订单 - " + order); } public void serveOrder(String order) { System.out.println("服务员:提供餐点 - " + order); } public void cancelOrder(String order) { System.out.println("服务员:取消订单 - " + order); } }3. 创建具体的命令类
// 下单命令 public class OrderCommand implements Command { private Waiter waiter; private String order; public OrderCommand(Waiter waiter, String order) { this.waiter = waiter; this.order = order; } @Override public void execute() { waiter.takeOrder(order); } @Override public void undo() { waiter.cancelOrder(order); } } // 上菜命令 public class ServeCommand implements Command { private Waiter waiter; private String order; public ServeCommand(Waiter waiter, String order) { this.waiter = waiter; this.order = order; } @Override public void execute() { waiter.serveOrder(order); } @Override public void undo() { System.out.println("撤销上菜命令"); } }4. 创建命令调用者类(Invoker)
// 下单命令 public class OrderCommand implements Command { private Waiter waiter; private String order; public OrderCommand(Waiter waiter, String order) { this.waiter = waiter; this.order = order; } @Override public void execute() { waiter.takeOrder(order); } @Override public void undo() { waiter.cancelOrder(order); } } // 上菜命令 public class ServeCommand implements Command { private Waiter waiter; private String order; public ServeCommand(Waiter waiter, String order) { this.waiter = waiter; this.order = order; } @Override public void execute() { waiter.serveOrder(order); } @Override public void undo() { System.out.println("撤销上菜命令"); } }5. 测试代码
public class Main { public static void main(String[] args) { // 创建服务员对象 Waiter waiter = new Waiter(); // 创建命令对象 Command order1 = new OrderCommand(waiter, "炒饭"); Command serve1 = new ServeCommand(waiter, "炒饭"); // 创建命令调用者对象 OrderInvoker invoker = new OrderInvoker(); // 下单并执行命令 invoker.executeCommand(order1); invoker.executeCommand(serve1); // 撤销上一个命令(如取消订单) invoker.undoCommand(); // 撤销上菜命令 invoker.undoCommand(); // 撤销订单命令 } }6. 输出结果
服务员:接到订单 - 炒饭 服务员:提供餐点 - 炒饭 撤销上菜命令 服务员:取消订单 - 炒饭解释:
Command接口定义了两个方法:execute()和undo()。execute()用于执行命令,undo()用于撤销命令。Waiter类是命令的接收者,负责具体的操作(如下单、提供餐点、取消订单等)。OrderCommand和ServeCommand是具体的命令类,实现了Command接口。OrderInvoker类负责接收命令并执行,同时维护一个历史栈(commandHistory),以便支持撤销功能。
通过命令模式,你可以将请求的发送者(如用户)和请求的执行者(如服务员)解耦,并且支持命令的撤销操作。