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
相关推荐
ByteX1 分钟前
springboot 项目某个接口响应特别慢排查
java·spring boot·后端
杀死那个蝈坦21 分钟前
Caffeine
java·jvm·spring cloud·tomcat
n***271922 分钟前
JAVA (Springboot) i18n国际化语言配置
java·spring boot·python
汤姆yu23 分钟前
基于springboot的校园家教信息系统
java·spring boot·后端·校园家教
心无旁骛~24 分钟前
python多进程multiprocessing——spawn启动方式解析
开发语言·python
q***062925 分钟前
Spring Boot--@PathVariable、@RequestParam、@RequestBody
java·spring boot·后端
urkay-27 分钟前
Android 切换应用语言
android·java·kotlin·iphone·androidx
小石头 1008633 分钟前
【Java】String类(超级详细!!!)
java·开发语言·算法
conkl36 分钟前
Python中的鸭子类型:理解动态类型的力量
开发语言·python·动态·鸭子类型·动态类型规划
小小8程序员37 分钟前
swift的inout的用法
开发语言·ios·swift