设计模式—命令模式

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 类图如下:

相关推荐
熊猫钓鱼>_>8 分钟前
Python小工具开发实战:从零构建自动化文件管理器的心得与体悟
开发语言·python·自动化
lb291717 分钟前
关于golang热加载安装,实时响应
开发语言·后端·golang·热加载
A227420 分钟前
自定义线程池 4.0
java·线程池
陈奕迅本讯23 分钟前
并发编程-Synchronized
开发语言·c#
康小庄24 分钟前
AQS独占模式——资源获取和释放源码分析
java·开发语言·jvm·spring boot·spring·spring cloud·nio
阿昌喜欢吃黄桃30 分钟前
mac安装mvnd结合idea
java·maven·idea·编译·打包·mvnd·编译打包
草明31 分钟前
macOS 查看当前命令行的ruby的安装目录
开发语言·macos·ruby
汤姆yu39 分钟前
基于python大数据的nba球员可视化分析系统
大数据·开发语言·python
feifeigo1231 小时前
python从环境变量和配置文件中获取配置参数
开发语言·python·adb
轩宇^_^1 小时前
C语言结构体与联合体详解
c语言·开发语言