Skip to content

设计模式:命令模式

ZhangPan edited this page Jul 16, 2025 · 4 revisions

命令模式(Command Pattern)是一种行为型设计模式,它将请求封装成一个对象,从而使你可以用不同的请求对客户进行参数化,支持请求排队或记录请求日志,以及支持可撤销的操作。下面我将详细介绍命令模式的核心概念、结构、实现方式以及实际应用场景。

命令模式的结构:

  1. Command(命令接口):声明执行操作的接口
  2. ConcreteCommand(具体命令):实现命令接口,绑定接收者与动作
  3. Invoker(调用者):持有命令对象并触发命令执行
  4. Receiver(接收者):知道如何实施与执行请求相关的操作
  5. Client(客户端):创建具体命令对象并设置接收者

命令模式的优点:

  • 降低系统耦合度:命令模式将调用操作的对象与实现该操作的对象解耦
  • 易于扩展:增加新的命令不会影响现有类,符合"开闭原则"
  • 支持撤销/重做:可以结合备忘录模式实现命令的撤销与恢复
  • 支持宏命令:可以将多个命令组合成一个复合命令
  • 支持事务:可以实现命令的事务性执行

命令模式的应用场景:

  • 需要将操作请求与执行解耦:如GUI按钮点击事件处理
  • 需要支持操作撤销/重做:如文本编辑器、绘图软件
  • 需要将操作排队或记录日志:如任务调度系统
  • 需要支持事务:如数据库操作需要原子性执行
  • 需要支持宏命令:如批处理操作

示例1:遥控器控制灯光

// 1. 命令接口
public interface Command {
    void execute();
}

// 2. 接收者 - 电灯
public class Light {
    public void on() {
        System.out.println("Light is on!");
    }
    
    public void off() {
        System.out.println("Light is off!");
    }
}

// 3. 具体命令 - 开灯命令
public class LightOnCommand implements Command {
    private Light light;
    
    public LightOnCommand(Light light) {
        this.light = light;
    }
    
    @Override
    public void execute() {
        light.on();
    }
}

// 4. 具体命令 - 关灯命令
public class LightOffCommand implements Command {
    private Light light;
    
    public LightOffCommand(Light light) {
        this.light = light;
    }
    
    @Override
    public void execute() {
        light.off();
    }
}

// 5. 调用者 - 遥控器按钮
public class RemoteControl {
    private Command command;
    
    public void setCommand(Command command) {
        this.command = command;
    }
    
    public void pressButton() {
        command.execute();
    }
}

// 6. 客户端测试
public class Client {
    public static void main(String[] args) {
        Light light = new Light();
        Command lightOn = new LightOnCommand(light);
        Command lightOff = new LightOffCommand(light);
        
        RemoteControl remote = new RemoteControl();
        
        remote.setCommand(lightOn);
        remote.pressButton(); // 开灯
        
        remote.setCommand(lightOff);
        remote.pressButton(); // 关灯
    }
}

示例2:餐厅点餐系统

// 1. 命令接口
public interface OrderCommand {
    void execute();
}

// 2. 接收者 - 厨师
public class Chef {
    public void makeBurger() {
        System.out.println("🍔 厨师正在制作汉堡!");
    }
    
    public void makeFries() {
        System.out.println("🍟 厨师正在炸薯条!");
    }
}

// 3. 具体命令 - 汉堡订单
public class BurgerOrder implements OrderCommand {
    private Chef chef;
    
    public BurgerOrder(Chef chef) {
        this.chef = chef;
    }
    
    @Override
    public void execute() {
        chef.makeBurger();
    }
}

// 4. 具体命令 - 薯条订单
public class FriesOrder implements OrderCommand {
    private Chef chef;
    
    public FriesOrder(Chef chef) {
        this.chef = chef;
    }
    
    @Override
    public void execute() {
        chef.makeFries();
    }
}

// 5. 调用者 - 服务员
public class Waiter {
    private List<OrderCommand> orders = new ArrayList<>();
    
    public void takeOrder(OrderCommand command) {
        orders.add(command);
    }
    
    public void submitOrders() {
        System.out.println("🧾 服务员提交订单给厨房...");
        for (OrderCommand command : orders) {
            command.execute();
        }
        orders.clear();
    }
}

// 6. 客户端测试
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();
    }
}

公众号:玩转安卓Dev

Java基础

面向对象与Java基础知识

Java集合框架

JVM

多线程与并发

设计模式

Kotlin

Android

项目相关问题

Android基础知识

Android消息机制

Android Binder

View事件分发机制

Android屏幕刷新机制

View的绘制流程

Activity启动

Framework

性能优化

Jetpack&系统View

第三方框架实现原理

计算机网络

算法

Clone this wiki locally