命令设计模式

Java命令模式分析

命令模式是一种行为型设计模式,它将请求封装为独立对象,实现请求发送者与接收者的解耦。以下是核心分析:

核心结构
  1. 命令接口(Command)

    声明执行操作的通用方法:

    java 复制代码
    public interface Command {
        void execute();
    }
  2. 具体命令(ConcreteCommand)

    实现命令接口,关联接收者对象:

    java 复制代码
    public class LightOnCommand implements Command {
        private Light light;  // 接收者对象
        
        public LightOnCommand(Light light) {
            this.light = light;
        }
        
        @Override
        public void execute() {
            light.turnOn();  // 调用接收者方法
        }
    }
  3. 调用者(Invoker)

    触发命令执行:

    java 复制代码
    public class RemoteControl {
        private Command command;
        
        public void setCommand(Command command) {
            this.command = command;
        }
        
        public void pressButton() {
            command.execute();  // 执行命令
        }
    }
  4. 接收者(Receiver)

    实际执行操作的对象:

    java 复制代码
    public class Light {
        public void turnOn() {
            System.out.println("Light is ON");
        }
    }
优势分析
  1. 解耦性:调用者无需知道接收者细节
  2. 可扩展性:新增命令不影响现有结构
  3. 复合命令:支持宏命令(命令组合)
  4. 撤销/重做:通过记录命令历史实现
适用场景
  • 需要回调机制的系统
  • 需要实现操作队列的场景
  • 需要支持事务/撤销的操作
  • GUI事件处理(如按钮点击)
代码示例
java 复制代码
// 客户端使用
public class Client {
    public static void main(String[] args) {
        Light light = new Light();  // 接收者
        Command lightOn = new LightOnCommand(light);
        
        RemoteControl remote = new RemoteControl();  // 调用者
        remote.setCommand(lightOn);
        remote.pressButton();  // 输出: Light is ON
    }
}
模式变体
  1. 带状态命令 :增加unexecute()实现撤销

  2. 组合命令 :实现命令批处理

    java 复制代码
    public class MacroCommand implements Command {
        private List<Command> commands = new ArrayList<>();
        
        public void add(Command cmd) {
            commands.add(cmd);
        }
        
        @Override
        public void execute() {
            commands.forEach(Command::execute);
        }
    }

该模式通过将操作请求对象化,实现了调用操作与具体实现的分离,符合开闭原则,是GUI框架和事务系统的核心设计范式。

相关推荐
折哥的程序人生 · 物流技术专研16 分钟前
《Java 100 天进阶之路》第95篇:消息队列基础(RocketMQ/Kafka)(2026版)
java·面试·kafka·rocketmq·java-rocketmq·求职招聘
budingxiaomoli22 分钟前
Spring日志
java·开发语言
IT空门:门主26 分钟前
Spring 注入三剑客:@Resource、@Autowired、@RequiredArgsConstructor 到底该用哪个?
java·后端·spring
Sam_Deep_Thinking1 小时前
Spring Boot 的启动原理是什么?
java·spring boot·后端
南部余额1 小时前
Spring WebClient 从入门到精通
java·后端·spring
CodeStats1 小时前
从 CPU 指令到 JVM 进程:彻底讲透 Java 执行 main 方法时,类加载、主线程、栈帧入栈的完整底层逻辑
java·linux·开发语言
摇滚侠1 小时前
Spring 零基础入门到进阶 基于注解管理 Bean 38-43
xml·java·后端·spring·intellij-idea
SamDeepThinking1 小时前
我们当年是如何真实落地BFF的?
java·后端·架构
码语智行1 小时前
Shapefile获取空间数据和中心点坐标
java·arcgis