命令设计模式

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框架和事务系统的核心设计范式。

相关推荐
搞不懂语言的程序员2 小时前
Spring源码解析 - SpringApplication run流程-refreshContext(context)源码分析
java·spring
_hermit:2 小时前
【从零开始java学习|第三篇】变量与数据类型的关联
java·学习
sql2008help5 小时前
使用spring-boot-starter-validation实现入参校验
java·开发语言
Mr_Air_Boy5 小时前
springboot集成xxl-job
java·spring boot·spring
Babybreath-6 小时前
Tomcat
java·tomcat
摇滚侠6 小时前
面试实战 问题二十三 如何判断索引是否生效,什么样的sql会导致索引失效
java
悟纤6 小时前
当生产环境卡成 PPT:Spring Boot 线程 Dump 捉妖指南 - 第544篇
java·spring boot·后端
江影影影8 小时前
Spring Boot 2.6.0+ 循环依赖问题及解决方案
java·spring boot·后端
Jonathan丶BNTang9 小时前
IntelliJ IDEA 2025.2 重磅发布
java·ide·intellij-idea
tanxiaomi10 小时前
学习分库分表的前置知识:高可用系统架构理论与实践
java·mysql·spring cloud·系统架构·springboot