设计模式 —— 命令模式

目录

  • 概述

  • UML

  • 实现

  • 优缺点

  • 使用场景


概述

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

UML

image-20240320102646059

实现

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

}
// 通用命令接口,确保每个接口都有特定方法
public interface Command {

    void execute();

}
/**
 * 关闭 按钮
 */
public class TurnOffCommand implements  Command{
    private Device device;

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

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

}

/**
 * 开启按钮
 */
public class TurnOnCommand implements  Command{
    private Device device;

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

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

}
/**
 * 调用者
 */
public class RemoteControl {

    private Command command;

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

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

}
/**
* 客户端
*/
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();
    }

}

/**
* 输出:
* TV:设备打开
* Stereo:设备关闭
*/

优点:

  1. 解耦请求发送者和接收者: 命令模式将请求封装成对象,使得请求发送者和请求接收者之间解耦,可以灵活地组合命令对象和请求接收者,降低系统的耦合度。
  2. 容易扩展新命令: 可以通过创建新的命令类来轻松扩展系统的功能,无需修改现有代码,符合开闭原则。
  3. 支持撤销和重做: 命令模式可以很容易地支持撤销和重做操作,通过保存历史命令或者记录执行前的状态数据,实现系统的撤销功能。
  4. 支持命令队列和日志: 可以将命令对象存储在队列中,实现命令的排队和日志记录,从而支持命令的延迟执行、撤销和重做操作。
  5. 适用于线程安全性要求高的场景: 在多线程环境下,命令模式可以有效地控制命令的执行顺序和并发访问,保证系统的安全性。

缺点:

  1. 类膨胀: 可能会导致系统中命令类的数量急剧增加,特别是系统中包含大量具体命令时,可能会导致类膨胀问题。
  2. 实现复杂度: 实现命令模式需要创建多个类和对象,可能会增加系统的复杂度,特别是对于简单的命令场景可能显得繁琐。
  3. 命令的执行效率: 在某些情况下,使用命令模式可能会影响系统的性能,因为每个命令都需要封装成对象,可能会增加额外的开销。

使用场景

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