设计模式-命令模式(Command Pattern)结构|原理|优缺点|场景|示例

设计模式(分类) 设计模式(六大原则)

创建型(5种) 工厂方法 抽象工厂模式 单例模式 建造者模式 原型模式

结构型(7种) 适配器模式 装饰器模式 代理模式 ​​​​​​外观模式 桥接模式 组合模式 享元模式

行为型(11种) 策略模式 模板方法模式 观察者模式 迭代器模式 责任链模式 命令模式 备忘录模式 状态模式 访问者模式 中介者模式

命令模式(Command Pattern)是一种行为设计模式,它将请求封装为一个对象,使得请求的发送者和接收者之间解耦。命令对象可以携带参数,支持撤销操作,并且可以被存储、记录、序列化、排队、日志等,从而为系统提供更大的灵活性。

结构:

  • Command(命令)接口/抽象类 : 定义执行命令的公共接口,通常包含一个执行方法(如 execute())。
  • ConcreteCommand(具体命令) : 实现命令接口,与接收者关联,并封装了需要执行的操作。当调用 execute() 方法时,具体命令会调用接收者的相关方法来完成请求。
  • Receiver(接收者): 定义了具体执行操作的对象,通常包含一组方法,这些方法可以被具体命令类调用。
  • Invoker(调用者) : 负责调用命令对象的 execute() 方法,它不关心命令对象的具体实现,只需知道命令的接口。

原理:

命令模式的核心思想是将"请求"封装成一个对象,使得请求可以被存储、传递、调用、撤销等。调用者与接收者之间通过命令对象进行交互,二者之间解耦,使得系统更易于扩展和维护。具体命令类持有接收者对象的引用,并在 execute() 方法中调用接收者的相应方法来执行请求。

优缺点:

  • 优点

    • 将请求与执行解耦,使二者独立变化。
    • 支持命令的撤销、重做、队列、日志等功能。
    • 方便实现宏命令、事务等高级功能。
    • 有利于系统分层,降低系统的耦合度。
  • 缺点

    • 命令类数量可能会随着系统功能的增加而增多,增加系统的复杂性。
    • 如果命令需要携带大量参数,可能会导致命令类的构造函数变得复杂。
    • 对于简单的请求,使用命令模式可能会显得过于复杂。

场景:

  • 需要将请求、操作封装为对象,以便进行存储、传递、调用、撤销等操作。
  • 需要支持事务操作,即一组操作必须全部成功或全部失败。
  • 需要将请求的发送者与接收者解耦,使得二者独立变化。

代码示例(以Java为例)

java 复制代码
// 命令接口
public interface Command {
    void execute();
}

// 具体命令类(打开电灯)
public class TurnOnLightCommand implements Command {
    private Light light;

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

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

// 具体命令类(关闭电灯)
public class TurnOffLightCommand implements Command {
    private Light light;

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

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

// 接收者类
public class Light {
    public void turnOn() {
        System.out.println("Light turned on.");
    }

    public void turnOff() {
        System.out.println("Light turned off.");
    }
}

// 调用者类
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) {
        Light light = new Light();
        RemoteControl remote = new RemoteControl();

        Command turnOnCommand = new TurnOnLightCommand(light);
        Command turnOffCommand = new TurnOffLightCommand(light);

        remote.setCommand(turnOnCommand);
        remote.pressButton();  // 打开电灯

        remote.setCommand(turnOffCommand);
        remote.pressButton();  // 关闭电灯
    }
}

在这个示例中,TurnOnLightCommandTurnOffLightCommand 是具体命令类,它们分别封装了打开和关闭电灯的操作。Light 类是接收者,提供了执行这些操作的方法。RemoteControl 类是调用者,它通过调用命令对象的 execute() 方法来执行请求,而不关心命令的具体实现。

相关推荐
软考真题app13 小时前
软件设计师考试结构型设计模式考点全解析
设计模式·软件设计师·结构型设计模式·考试考点
xiaolin033318 小时前
【设计模式】- 行为型模式1
设计模式·状态模式·责任链模式·策略模式·命令模式·模板方法模式·行为型模式
沐土Arvin19 小时前
深入理解 requestIdleCallback:浏览器空闲时段的性能优化利器
开发语言·前端·javascript·设计模式·html
bao_lanlan19 小时前
兰亭妙微:用系统化思维重构智能座舱 UI 体验
ui·设计模式·信息可视化·人机交互·交互·ux·外观模式
总是难免21 小时前
设计模式 - 单例模式 - Tips
java·单例模式·设计模式
Java致死1 天前
设计模式Java
java·开发语言·设计模式
ghost1432 天前
C#学习第23天:面向对象设计模式
开发语言·学习·设计模式·c#
敲代码的 蜡笔小新2 天前
【行为型之迭代器模式】游戏开发实战——Unity高效集合遍历与场景管理的架构精髓
unity·设计模式·c#·迭代器模式
敲代码的 蜡笔小新3 天前
【行为型之命令模式】游戏开发实战——Unity可撤销系统与高级输入管理的架构秘钥
unity·设计模式·架构·命令模式
m0_555762903 天前
D-Pointer(Pimpl)设计模式(指向实现的指针)
设计模式