设计模式——命令模式

命令模式(Command Pattern)是一种行为型设计模式,它将一个请求封装为一个对象,使发出请求的对象和执行请求的对象解耦。这样可以方便地对请求排队、记录日志、撤销/重做操作以及支持可扩展性。

原理

  • 命令接口(Command Interface): 定义了执行命令的统一方法,如execute()。
  • 具体命令类(Concrete Command): 实现命令接口,与接收者关联,并在execute()方法中调用接收者的特定方法来完成实际工作。
  • 接收者(Receiver): 执行命令对应的操作,真正干活的对象。
  • 调用者(Invoker): 负责调用命令对象执行请求的方法。

Java代码示例

java 复制代码
// 命令接口
public interface Command {
    void execute();
}

// 具体命令类 - 开灯命令
public class TurnOnLightCommand implements Command {
    private final Light light;

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

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

// 接收者 - 灯光控制类
public class Light {
    public void turnOn() {
        System.out.println("The light is on.");
    }

    public void turnOff() {
        System.out.println("The light is off.");
    }
}

// 调用者 - 控制器类
public class RemoteControl {
    private Command command;

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

    public void pressButton() {
        if (command != null) {
            command.execute();
        } else {
            System.out.println("No command assigned to the remote control.");
        }
    }
}

// 使用示例
public class Client {
    public static void main(String[] args) {
        Light light = new Light();
        Command turnOnCommand = new TurnOnLightCommand(light);
        
        RemoteControl remote = new RemoteControl();
        remote.setCommand(turnOnCommand);
        remote.pressButton();  // 输出: The light is on.
    }
}

想象你正在使用遥控器操作电视。遥控器是调用者,开关电视的操作就是命令,而电视则是接收者。当你按下遥控器上的开关键时,实际上是向电视发送了一个"打开"的命令,电视接收到这个命令后执行打开操作。这种情况下,无论遥控器如何变化(比如换成了语音遥控器),只要遵循相同的命令接口,都能控制电视打开或关闭。

应用场景

  • 图形用户界面(GUI):菜单项对应不同的命令,点击后执行相应的操作。
  • 事务处理:一组操作被封装成命令,可以作为一个单元进行提交或回滚。
  • 远程调用:通过网络发送命令到远程服务器并执行。
  • 日志系统:记录用户的操作序列,以便于后续的重做或撤销操作

适用性

  • 需要在不同的时间点执行请求,例如需要实现异步操作或者队列请求。
  • 需要对请求进行记录以备后用,如撤销/重做功能。
  • 需要支持可扩展的命令集,使得新的命令易于添加。
  • 需要在几个对象间解耦,使得调用者不必知道接收者的具体类型。
相关推荐
ok!ko3 小时前
设计模式之原型模式(通俗易懂--代码辅助理解【Java版】)
java·设计模式·原型模式
2402_857589363 小时前
“衣依”服装销售平台:Spring Boot框架的设计与实现
java·spring boot·后端
吾爱星辰4 小时前
Kotlin 处理字符串和正则表达式(二十一)
java·开发语言·jvm·正则表达式·kotlin
拉里小猪的迷弟4 小时前
设计模式-创建型-常用:单例模式、工厂模式、建造者模式
单例模式·设计模式·建造者模式·工厂模式
哎呦没4 小时前
大学生就业招聘:Spring Boot系统的架构分析
java·spring boot·后端
编程、小哥哥5 小时前
netty之Netty与SpringBoot整合
java·spring boot·spring
IT学长编程6 小时前
计算机毕业设计 玩具租赁系统的设计与实现 Java实战项目 附源码+文档+视频讲解
java·spring boot·毕业设计·课程设计·毕业论文·计算机毕业设计选题·玩具租赁系统
莹雨潇潇6 小时前
Docker 快速入门(Ubuntu版)
java·前端·docker·容器
严文文-Chris6 小时前
【设计模式-中介者模式】
设计模式·中介者模式
刷帅耍帅6 小时前
设计模式-中介者模式
设计模式·中介者模式