• 设计模式—命令模式


    1.什么是命令模式?

    命令模式是一种行为型设计模式,核心是将每种请求或操作封装为一个独立的对象,从而可以集中管理这些请求或操作,比如将请求队列化依次执行、或者对操作进行记录和撤销。

    命令模式通过将请求的发送者(客户端)和接收者(执行请求的对象)解耦,提供了更大的灵活性和可维护性。

    2.命令模式的优点和应用场景

    命令模式最大的优点就是解耦请求发送者和接受者,让系统更加灵活、可扩展。

    由于每个操作都是一个独立的命令类,所以我们需要新增命令操作时,不需要改动现有代码。

    命令模式典型的应用场景:

    • 系统需要统一处理多种复杂的操作,比如操作排队、记录操作历史、撤销重做等。
    • 系统需要持续增加新的命令、或者要处理复杂的组合命令(子命令),使用命令模式可以实现解耦。

    3.命令模式的要素和实现

    1)命令

    相当于遥控器操作按钮的制作规范

    命令是一个抽象类或接口,它定义了执行操作的方法,通常是execute,该方法封装了具体的操作。

    1. public interface Command {
    2.     void execute();
    3. }
    2)具体命令

    相当于遥控器的某个操作按钮

    具体命令是命令接口的具体实现类,它负责将请求传递给接收者(设备)并执行具体的操作。

    比如定义一个关闭设备命令:

    1. public class TurnOffCommand implements Command {
    2.     private Device device;
    3.     public TurnOffCommand(Device device) {
    4.         this.device = device;
    5.     }
    6.     public void execute() {
    7.         device.turnOff();
    8.     }
    9. }

    还可以定义开启设备命令:

    1. public class TurnOnCommand implements Command {
    2.     private Device device;
    3.     public TurnOnCommand(Device device) {
    4.         this.device = device;
    5.     }
    6.     public void execute() {
    7.         device.turnOn();
    8.     }
    9. }
    3)接受者

    相当于被遥控的设备

    接收者是最终执行命令的对象,知道如何执行具体的操作。

    比如定义一个设备类:

    1. public class Device {
    2.     private String name;
    3.     public Device(String name) {
    4.         this.name = name;
    5.     }
    6.     public void turnOn() {
    7.         System.out.println(name + " 设备打开");
    8.     }
    9.     public void turnOff() {
    10.         System.out.println(name + " 设备关闭");
    11.     }
    12. }
    4)调用者

    相当于遥控器

    作用是接受客户端的命令并执行。

    比如定义遥控器类:

    1. public class RemoteControl {
    2.     private Command command;
    3.     public void setCommand(Command command) {
    4.         this.command = command;
    5.     }
    6.     public void pressButton() {
    7.         command.execute();
    8.     }
    9. }

    以上只是最基础的调用者类,还可以给遥控器类增加更多能力,比如存储历史记录、撤销重做等。

    5)客户端

    相当于使用遥控器的人

    客户端的作用是创建命令对象并将其与接收者关联(绑定设备),然后将命令对象传递给调用者(按遥控器),从而触发执行。

    示例客户端:

    1. public class Client {
    2.     public static void main(String[] args) {
    3.         // 创建接收者对象
    4.         Device tv = new Device("TV");
    5.         Device stereo = new Device("Stereo");
    6.         // 创建具体命令对象,可以绑定不同设备
    7.         TurnOnCommand turnOn = new TurnOnCommand(tv);
    8.         TurnOffCommand turnOff = new TurnOffCommand(stereo);
    9.         // 创建调用者
    10.         RemoteControl remote = new RemoteControl();
    11.         // 执行命令
    12.         remote.setCommand(turnOn);
    13.         remote.pressButton();
    14.         remote.setCommand(turnOff);
    15.         remote.pressButton();
    16.     }
    17. }

    在这个示例中,命令模式将遥控器按钮的按下操作与实际设备的开关操作解耦,从而实现了灵活的控制和可扩展性。

    整个程序的 UML 类图如下:

    图片

  • 相关阅读:
    HarmonyOS 应用生命周期有哪些? 按返回键会调用哪些生命周期?
    【云原生】Kubernetes核心技术(上)
    Spring Boot中全局异常处理器
    MySQL---搜索引擎
    基于JAVA校园疫情防控系统(Springboot框架) 开题报告
    基于javaweb的顶岗实习管理系统(jsp+servlet)
    推荐一款高效率前端开发神器,功能太强大了
    大模型幻觉成应用落地难题 最新评测文心一言解决幻觉能力最好文心一言解决幻觉能力最好 或成产业应用首选
    自定义字典简化代码解决定制需求
    【C++】继承与多态相关11道面试题整理
  • 原文地址:https://blog.csdn.net/kologin/article/details/134535662