Java 设计模式之命令模式

命令模式

介绍

命令模式是一种行为类设计模式,核心是将每种请求或操作封装为一个独立的对象,从而可以集中管理这些请求或操作,比如将请求队列化依次执行、或者对操作进行记录和撤销。 命令模式通过将请求的发送者(客户端)和接收者(执行请求的对象)解耦,提供了更大的灵活性和可维护性。

下面来举个例子

我们在生活中都用过电视机,我们 就相当于客户端,要操作电视 来换台;而 电视 就是执行请求的对象,要根据我们的操作来换台。但是我们一般不会直接按电视上的按钮来换台,而是用一个 遥控器 ,通过点击遥控器上的 操作按钮 来控制电视。 这样就相当于把我们和电视解耦了。哪怕遥控器丢了,再换一个遥控器就好了;而且现在手机都能作为万能的电视遥控器,我们可以同时遥控多个品牌的设备,不用关心设备的具体品牌型号,提供了更大的方便。

优点

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

代码示例

Command.java

java 复制代码
public interface Command {
    void execute();
}

Device.java

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 + " 设备关闭");
    }
}

RemoteControl.java

java 复制代码
public class RemoteControl {

    private Command command;

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

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

TurnOffCommand.java

java 复制代码
public class TurnOffCommand implements Command {

    private Device device;

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

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

TurnOnCommand

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

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

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

Client.java

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

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

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

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

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

运行结果

UML类图

相关推荐
憧憬blog2 小时前
【Kiro开发集训营】拒绝“屎山”堆积:在 Kiro 中重构“需求-代码”的血缘关系
java·开发语言·kiro
e***74953 小时前
Spring Security 官网文档学习
java·学习·spring
n***i953 小时前
Java NIO文件操作
java·开发语言·nio
笃行客从不躺平4 小时前
接口幂等性(Idempotency)
java
Hero | 柒5 小时前
JAVA反射机制
java·spring·反射
j***63085 小时前
Springboot项目中线程池使用整理
java·spring boot·后端
likuolei5 小时前
Eclipse 创建 Java 接口
java·数据库·eclipse
q***54755 小时前
Spring Boot 经典九设计模式全览
java·spring boot·设计模式
a***56065 小时前
Spring Boot接收参数的19种方式
java·spring boot·后端
z***75155 小时前
SpringBoot集成MQTT客户端
java·spring boot·后端