在 Java 中使用命令模式来模拟餐厅下单吃饭的过程,可以通过以下步骤来实现:
-
创建命令接口 :所有的命令都需要实现一个命令接口,包含一个
execute()方法。 -
创建具体的命令类:每个具体的命令(比如下单、撤销订单)都需要实现命令接口。
-
创建接收者类:这些类是命令的实际执行者(如餐厅的服务员、厨师等)。
-
创建命令调用者类:负责调度命令并保存命令以支持撤销功能。
以下是一个简单的实现:
1. 创建命令接口
java
public interface Command {
void execute(); // 执行命令
void undo(); // 撤销命令
}
2. 创建接收者类(如餐厅服务员、厨师等)
java
// 服务员类
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. 创建具体的命令类
java
// 下单命令
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)
java
// 下单命令
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. 测试代码
java
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. 输出结果
java
服务员:接到订单 - 炒饭
服务员:提供餐点 - 炒饭
撤销上菜命令
服务员:取消订单 - 炒饭
解释:
-
Command接口 定义了两个方法:execute()和undo()。execute()用于执行命令,**undo()**用于撤销命令。 -
Waiter类是命令的接收者,负责具体的操作(如下单、提供餐点、取消订单等)。 -
OrderCommand和**ServeCommand** 是具体的命令类,实现了Command接口。 -
OrderInvoker类 负责接收命令并执行,同时维护一个历史栈(commandHistory),以便支持撤销功能。
通过命令模式,你可以将请求的发送者(如用户)和请求的执行者(如服务员)解耦,并且支持命令的撤销操作。