Java 编程之命令模式

什么是命令模式

命令模式Command Pattern 是一种行为型设计模式,它把请求封装成对象,从而将请求的发送者与执行者完全解耦,支持排队、撤销、日志记录等操作。。

模式目标

解耦命令的发出者(Invoker)执行者(Receiver)

模式例子

在生活中,比如麦当劳点餐流程,来看看命令模式的经典现实例子:

角色 对应命令模式中的角色
顾客 请求发送者 Invoker
点餐员 命令对象 Command
厨房/厨师 实际执行者 Receiver
点菜单 被封装的命令 Request
text 复制代码
顾客(Invoker)下单 → 服务员记录订单(Command) → 厨师(Receiver)执行烹饪操作
  • 顾客不关心怎么做菜;
  • 厨师不关心是谁点的;
  • 服务员中转命令,负责排队、取消、记录等操作。

👉 服务员就是命令模式中的 Command 对象

UML图

通用表示:

针对本例:

Java 命令模式完整实现

我们模拟一个遥控器控制家电的命令模式案例。

命令接口

Command

java 复制代码
public interface OrderCommand {
    void execute();
}

厨师类(实际执行者 Receiver)

java 复制代码
public class Chef {
    public void makeBurger() {
        System.out.println("🍔 厨师正在制作汉堡!");
    }

    public void makeFries() {
        System.out.println("🍟 厨师正在炸薯条!");
    }
}

实际执行者 Receiver

java 复制代码
public class BurgerOrder implements OrderCommand {
    private Chef chef;

    public BurgerOrder(Chef chef) {
        this.chef = chef;
    }

    @Override
    public void execute() {
        chef.makeBurger();
    }
}

public class FriesOrder implements OrderCommand {
    private Chef chef;

    public FriesOrder(Chef chef) {
        this.chef = chef;
    }

    @Override
    public void execute() {
        chef.makeFries();
    }
}

服务员类(Invoker)

java 复制代码
public class Waiter {
    private List<OrderCommand> orderList = new ArrayList<>();

    public void takeOrder(OrderCommand command) {
        orderList.add(command);
    }

    public void submitOrders() {
        System.out.println("🧾 服务员提交订单给厨房...");
        for (OrderCommand command : orderList) {
            command.execute();
        }
        orderList.clear();
    }
}

客户端测试代码

java 复制代码
public class Customer {
    public static void main(String[] args) {
        Chef chef = new Chef();

        // 创建命令对象
        OrderCommand burger = new BurgerOrder(chef);
        OrderCommand fries = new FriesOrder(chef);

        // 顾客下单,服务员记录
        Waiter waiter = new Waiter();
        waiter.takeOrder(burger);
        waiter.takeOrder(fries);

        // 服务员提交订单,厨师开始执行
        waiter.submitOrders();
    }
}

运行结果

命令模式的优点与用途

优点

优点 描述
解耦调用者和接收者 请求发送者不关心具体怎么做
支持撤销与日志记录 可记录命令序列,回滚操作
支持命令组合与排队 命令对象可以存入队列或组合

实际应用场景

应用场景 示例说明
UI按钮命令绑定 Swing按钮点击执行某个命令
事务操作/回滚 数据库事务日志
宏命令/组合操作 Photoshop一键动作
消息队列处理 Kafka、RabbitMQ 消息处理器

总结

  • 命令模式是高内聚、低耦合的典范;
  • 适合对请求进行记录、排队、撤销等处理;
  • 可广泛应用于 UI 控件回调、遥控设备、游戏命令、数据库事务管理等场景。

参考

《23种设计模式概览》

plantuml 复制代码
@startuml
title Java命令模式结构图

interface Command {
    +execute()
}

class ConcreteCommand {
    -receiver: Receiver
    +execute()
}

class Receiver {
    +action()
}

class Invoker {
    +setCommand(cmd: Command)
    +invoke()
}

Command <|-- ConcreteCommand
ConcreteCommand --> Receiver
Invoker --> Command

@enduml
相关推荐
会飞的小新15 小时前
Shell 脚本中的信号与 trap:从 Ctrl+C 到优雅退出
linux·开发语言
LawrenceLan15 小时前
Flutter 零基础入门(十):final、const 与不可变数据
开发语言·flutter·dart
mjhcsp15 小时前
C++ Manacher 算法:原理、实现与应用全解析
java·c++·算法·manacher 算法
Coder_Boy_15 小时前
基于SpringAI的在线考试系统-企业级软件研发工程应用规范案例
java·运维·spring boot·软件工程·devops
indexsunny15 小时前
互联网大厂Java面试实战:微服务、Spring Boot与Kafka在电商场景中的应用
java·spring boot·微服务·面试·kafka·电商
SUDO-115 小时前
Spring Boot + Vue 2 的企业级 SaaS 多租户招聘管理系统
java·spring boot·求职招聘·sass
sheji341615 小时前
【开题答辩全过程】以 基于spring boot的停车管理系统为例,包含答辩的问题和答案
java·spring boot·后端
重生之后端学习15 小时前
21. 合并两个有序链表
java·算法·leetcode·链表·职场和发展
源代码•宸15 小时前
Leetcode—1266. 访问所有点的最小时间【简单】
开发语言·后端·算法·leetcode·职场和发展·golang
遇见~未来16 小时前
JavaScript数组全解析:从本质到高级技巧
开发语言·前端·javascript