23种设计模式-行为型模式之命令模式(Java版本)

Java 命令模式(Command Pattern)详解

🧠 什么是命令模式?

命令模式是一种行为型设计模式,它将请求封装成一个对象,从而使你可以使用不同的请求、队列、日志请求以及支持可撤销的操作。

命令模式将请求的发送者和接收者解耦,调用者不再直接操作接收者对象,而是通过命令对象来实现。


🎯 使用场景

  • 需要将请求调用者与请求接收者解耦
  • 希望支持撤销、重做操作
  • 需要支持日志记录和事务处理等功能

🏗️ 模式结构

  • Command(命令接口) :声明执行命令的接口,通常有一个 execute() 方法
  • ConcreteCommand(具体命令类):实现命令接口,定义具体的执行操作
  • Invoker(调用者) :请求命令的对象,调用命令对象的 execute() 方法
  • Receiver(接收者):知道如何执行与请求相关的操作,实际执行命令的类

✅ 示例:遥控器控制灯光

命令接口

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

具体命令类

java 复制代码
public class LightOnCommand implements Command {
    private Light light;

    public LightOnCommand(Light light) {
        this.light = light;
    }

    @Override
    public void execute() {
        light.turnOn();
    }
}

public class LightOffCommand implements Command {
    private Light light;

    public LightOffCommand(Light light) {
        this.light = light;
    }

    @Override
    public void execute() {
        light.turnOff();
    }
}

接收者类

java 复制代码
public class Light {
    public void turnOn() {
        System.out.println("Light is ON");
    }

    public void turnOff() {
        System.out.println("Light is OFF");
    }
}

调用者类

java 复制代码
public class RemoteControl {
    private Command command;

    public void setCommand(Command command) {
        this.command = command;
    }

    public void pressButton() {
        command.execute();
    }
}

客户端

java 复制代码
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();  // 输出:Light is ON

        remote.setCommand(lightOff);
        remote.pressButton();  // 输出:Light is OFF
    }
}

✅ 优点

  • 请求发送者和接收者解耦
  • 可以灵活地增加或改变命令
  • 支持撤销和重做功能
  • 可以组合多个命令

⚠️ 缺点

  • 增加了类的数量,系统复杂度增加
  • 对于简单操作,命令模式的使用可能显得过于复杂

🧩 使用建议

命令模式适合那些需要将请求发起者与请求执行者解耦的场景,尤其是当你需要提供撤销、重做操作或将多个命令封装成一个组合命令时。

相关推荐
老胖闲聊3 分钟前
Python Rio 【图像处理】库简介
开发语言·图像处理·python
码界奇点23 分钟前
Python Flask文件处理与异常处理实战指南
开发语言·python·自然语言处理·flask·python3.11
stein_java30 分钟前
springMVC-10验证及国际化
java·spring
贩卖纯净水.33 分钟前
浏览器兼容-polyfill-本地服务-优化
开发语言·前端·javascript
weixin_4786897633 分钟前
C++ 对 C 的兼容性
java·c语言·c++
k要开心38 分钟前
C++概念以及基础框架语法
开发语言·c++
LUCIAZZZ1 小时前
HikariCP数据库连接池原理解析
java·jvm·数据库·spring·springboot·线程池·连接池
胡侃有料1 小时前
【设计模式】1.简单工厂、工厂、抽象工厂模式
设计模式·抽象工厂模式
sky_ph1 小时前
JAVA-GC浅析(二)G1(Garbage First)回收器
java·后端
开发者工具分享1 小时前
如何应对敏捷转型中的团队阻力
开发语言