命令设计模式

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

相关推荐
皮皮林5519 小时前
Java性能调优黑科技!1行代码实现毫秒级耗时追踪,效率飙升300%!
java
冰_河9 小时前
QPS从300到3100:我靠一行代码让接口性能暴涨10倍,系统性能原地起飞!!
java·后端·性能优化
桦说编程12 小时前
从 ForkJoinPool 的 Compensate 看并发框架的线程补偿思想
java·后端·源码阅读
躺平大鹅14 小时前
Java面向对象入门(类与对象,新手秒懂)
java
初次攀爬者15 小时前
RocketMQ在Spring Boot上的基础使用
java·spring boot·rocketmq
花花无缺15 小时前
搞懂@Autowired 与@Resuorce
java·spring boot·后端
Derek_Smart16 小时前
从一次 OOM 事故说起:打造生产级的 JVM 健康检查组件
java·jvm·spring boot
NE_STOP17 小时前
MyBatis-mybatis入门与增删改查
java
孟陬20 小时前
国外技术周刊 #1:Paul Graham 重新分享最受欢迎的文章《创作者的品味》、本周被划线最多 YouTube《如何在 19 分钟内学会 AI》、为何我不
java·前端·后端