设计模式—命令模式

1.什么是命令模式?

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

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

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

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

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

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

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

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

1)命令

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

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

java 复制代码
public interface Command {
    void execute();
}
2)具体命令

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

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

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

java 复制代码
public class TurnOffCommand implements Command {
    private Device device;

    public TurnOffCommand(Device device) {
        this.device = device;
    }

    public void execute() {
        device.turnOff();
    }
}

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

java 复制代码
public class TurnOnCommand implements Command {
    private Device device;

    public TurnOnCommand(Device device) {
        this.device = device;
    }

    public void execute() {
        device.turnOn();
    }
}
3)接受者

相当于被遥控的设备

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

比如定义一个设备类:

java 复制代码
public class Device {
    private String name;

    public Device(String name) {
        this.name = name;
    }

    public void turnOn() {
        System.out.println(name + " 设备打开");
    }

    public void turnOff() {
        System.out.println(name + " 设备关闭");
    }
}
4)调用者

相当于遥控器

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

比如定义遥控器类:

java 复制代码
public class RemoteControl {
    private Command command;

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

    public void pressButton() {
        command.execute();
    }
}

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

5)客户端

相当于使用遥控器的人

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

示例客户端:

java 复制代码
public class Client {
    public static void main(String[] args) {
        // 创建接收者对象
        Device tv = new Device("TV");
        Device stereo = new Device("Stereo");

        // 创建具体命令对象,可以绑定不同设备
        TurnOnCommand turnOn = new TurnOnCommand(tv);
        TurnOffCommand turnOff = new TurnOffCommand(stereo);

        // 创建调用者
        RemoteControl remote = new RemoteControl();

        // 执行命令
        remote.setCommand(turnOn);
        remote.pressButton();

        remote.setCommand(turnOff);
        remote.pressButton();
    }
}

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

整个程序的 UML 类图如下:

相关推荐
我是场2 分钟前
Android14内核调试 - boot & vendor_boot
java·开发语言·spring boot
爱和冰阔落3 分钟前
从关机小游戏学 C 语言:分支循环 + 关键字(break/continue)实战
c语言·开发语言
Harold8 分钟前
【用户访问鉴权】Openresty实现方案
后端
用户97044387811611 分钟前
PHP 函数的参数顺序,它们是随机的吗?
后端·程序员·代码规范
3学习分享吧13 分钟前
C++从0实现百万并发Reactor服务器(完结)
后端
Korloa15 分钟前
表达式(CSP-J 2021-Expr)题目详解
c语言·开发语言·数据结构·c++·算法·蓝桥杯·个人开发
fake_ss19816 分钟前
从零开发Java坦克大战Ⅱ (下)-- 从单机到联机(完整架构功能实现)
java·网络·tcp/ip·游戏程序
lssjzmn30 分钟前
java中,synchronized 关键字与 ReentrantLock 重入锁的区别以及应用场景,注意事项
java·后端
渣哥33 分钟前
Spring循环依赖的终极解密:三级缓存如何拯救Bean创建死锁
java
初岘38 分钟前
自动驾驶架构:人为接口与隐式特征的博弈
人工智能·架构·自动驾驶