命令设计模式

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

相关推荐
程序员小假32 分钟前
我们来说一下无锁队列 Disruptor 的原理
java·后端
资生算法程序员_畅想家_剑魔1 小时前
Kotlin常见技术分享-02-相对于Java 的核心优势-协程
java·开发语言·kotlin
ProgramHan1 小时前
Spring Boot 3.2 新特性:虚拟线程的落地实践
java·jvm·spring boot
nbsaas-boot1 小时前
Go vs Java 的三阶段切换路线图
java·开发语言·golang
毕设源码-钟学长2 小时前
【开题答辩全过程】以 基于Java的慕课点评网站为例,包含答辩的问题和答案
java·开发语言
小北方城市网2 小时前
分布式锁实战指南:从选型到落地,避开 90% 的坑
java·数据库·redis·分布式·python·缓存
深圳佛手2 小时前
使用java,怎么样高效地读取一个大文件(10g以上)?
java·开发语言
sheji34162 小时前
【开题答辩全过程】以 景点移动导游系统的设计与实现为例,包含答辩的问题和答案
java
毕设源码-赖学姐2 小时前
【开题答辩全过程】以 高校失物招领信息管理系统的设计与开发为例,包含答辩的问题和答案
java
xiaolyuh1232 小时前
【XXL-JOB】 GLUE模式 底层实现原理
java·开发语言·前端·python·xxl-job