Java设计模式-命令模式

在 Java 中使用命令模式来模拟餐厅下单吃饭的过程,可以通过以下步骤来实现:

  1. 创建命令接口 :所有的命令都需要实现一个命令接口,包含一个 execute() 方法。

  2. 创建具体的命令类:每个具体的命令(比如下单、撤销订单)都需要实现命令接口。

  3. 创建接收者类:这些类是命令的实际执行者(如餐厅的服务员、厨师等)。

  4. 创建命令调用者类:负责调度命令并保存命令以支持撤销功能。

以下是一个简单的实现:

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 复制代码
服务员:接到订单 - 炒饭
服务员:提供餐点 - 炒饭
撤销上菜命令
服务员:取消订单 - 炒饭

解释:

  1. Command 接口 定义了两个方法:execute() 和 undo()。execute() 用于执行命令,**undo()**用于撤销命令。

  2. Waiter 类是命令的接收者,负责具体的操作(如下单、提供餐点、取消订单等)。

  3. OrderCommand 和**ServeCommand** 是具体的命令类,实现了 Command 接口。

  4. OrderInvoker 类 负责接收命令并执行,同时维护一个历史栈(commandHistory),以便支持撤销功能。

通过命令模式,你可以将请求的发送者(如用户)和请求的执行者(如服务员)解耦,并且支持命令的撤销操作。

相关推荐
蛋蛋的就会顺顺的10 小时前
hot100 p0——栈,贪心算法,动态规划
java·前端·javascript·算法·leetcode·力扣
需要82610 小时前
Spring Bean 生命周期:从实例化到销毁的完整钩子
java·后端·spring
小 黄 鸡10 小时前
HashMap 面试必会知识点详解(JDK 8)
java·面试·职场和发展
伯恩bourne12 小时前
Spring Boot Bean 注册的两种方式:@Component 家族 vs @Configuration + @Bean
java·spring boot·后端
silvamux_13 小时前
curl 测试 OpenAI 兼容 API 的完整流程
java·人工智能·缓存·ai·oneapi
省钱兄--zs13 小时前
深圳24小时自助健身房软硬件解决方案实战指南与开发流程详解
java·数据仓库·spring boot·小程序·架构
顽疲13 小时前
Java vue 养老系统源码详解:月账单 care_month_bill 与 Quartz 扣费 Job 实践
java·开发语言·vue.js·vue养老·springboot养老·java养老
Wang's Blog13 小时前
Java 项目实战: 交友项目 - 安装开发工具与环境准备
java·开发语言·交友
用户212968352616814 小时前
开源了一个 Java 多智能体 LLM 框架 Baton:一个依赖,把 Agent 循环、工具调用、记忆、编排全配齐
java·llm
helmsail14 小时前
05 管理活动与选品
java