设计模式Java实现-命令模式

168 阅读3分钟

✨这里是第七人格的博客✨小七,欢迎您的到来~✨

🍅系列专栏:设计模式🍅

✈️本篇内容: 命令模式✈️

🍱 本篇收录完整代码地址:gitee.com/diqirenge/d… 🍱

楔子

小七记得以前上大学玩单片机的时候,有这么一个课程设计,就是用汇编控制灯的开启和关闭,虽然当时用了大量的if-else,但是最后完成的时候,还是很有自豪感的。

需求背景

现在我们用Java来实现电灯开关的开启和关闭。

分析设计

首先我们带入一下生活场景,灯的开启和关闭是靠开关控制的,那么我们至少得有2个类:

1、灯。其中有一个属性,表明灯的状态是开启还是关闭。

2、开关。由人触发并且发送信号控制灯的状态。

至于开关发送的信号,我们可以直接if一把梭,也可以把他们抽象成开和关两个命令,由开关触发。

UML图

根据分析设计,我们可以先画一个简单的UML图,后面通过UML图编码

Command.png

模块名称

command

模块地址

gitee.com/diqirenge/d…

模块描述

命令模式代码示例

代码实现

1、编写命令接收者

/**
 * 灯
 * 关注公众号【奔跑的码畜】,一起进步不迷路
 *
 * @author 第七人格
 * @date 2024/01/18
 */
public class Light {
    /**  
     * 内部维护的是否开启状态
     */
    private boolean isOn;

    public void on() {
        isOn = true;
        System.out.println("Light is on");
    }

    public void off() {
        isOn = false;
        System.out.println("Light is off");
    }
}

2、编写命令相关代码

抽象命令接口

/**
 * 命令接口
 * 关注公众号【奔跑的码畜】,一起进步不迷路
 *
 * @author 第七人格
 * @date 2024/01/18
 */
public interface Command {
    void execute();
}

关命令

/**
 * 灯-关命令
 * 关注公众号【奔跑的码畜】,一起进步不迷路
 *
 * @author 第七人格
 * @date 2024/01/18
 */
public class LightOffCommand implements Command {
    private Light light;

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

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

开命令

/**
 * 灯-开命令
 * 关注公众号【奔跑的码畜】,一起进步不迷路
 *
 * @author 第七人格
 * @date 2024/01/18
 */
public class LightOnCommand implements Command {
    private Light light;

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

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

3、编写命令发送者

/**
 * 开关控制器-命令发送者
 * 关注公众号【奔跑的码畜】,一起进步不迷路
 *
 * @author 第七人格
 * @date 2024/01/18
 */
public class RemoteControl {
    private Command command;

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

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

4、编写测试类

/**
 * 测试命令模式
 * 关注公众号【奔跑的码畜】,一起进步不迷路
 *
 * @author 第七人格
 * @date 2024/01/18
 */
public class CommandTest {

    @Test
    public void testCommand() {
        // 创建灯对象
        Light light = new Light();

        // 创建打开灯光的命令对象
        Command lightOnCommand = new LightOnCommand(light);

        // 创建关闭灯光的命令对象
        Command lightOffCommand = new LightOffCommand(light);

        // 创建遥控器对象
        RemoteControl remoteControl = new RemoteControl();

        // 设置遥控器的命令为打开灯光的命令
        remoteControl.setCommand(lightOnCommand);
        // 按下按钮,打开灯光
        remoteControl.pressButton();

        // 设置遥控器的命令为关闭灯光的命令
        remoteControl.setCommand(lightOffCommand);
        // 按下按钮,关闭灯光
        remoteControl.pressButton();
    }
}

5、测试结果

Light is on

Light is off

实现要点

命令模式实现要点如下:

  1. 定义一个命令接口,包含执行方法。文中示例为:Command。
  2. 创建具体的命令类,实现命令接口,并持有接收者对象。文中示例为:LightOffCommand 和 LightOnCommand。
  3. 创建接收者类,实现具体操作。文中示例为:RemoteControl。
  4. 在客户端代码中,创建具体的命令对象和接收者对象,将命令对象设置给调用者对象,然后调用调用者对象的execute方法执行命令。

总结

命令模式在日常开发中不算多见,它将请求封装为对象,从而使用户可以使用不同的请求参数化其他对象,属于行为设计模式。