设计模式-命令模式

命令模式(Command Pattern) 是一种行为型设计模式,它将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。

命令模式的核心思想是 将请求的发出者与处理者解耦,请求的发出者只需知道如何调用命令,而不需要了解命令的具体执行细节。


命令模式的组成部分

  1. 命令接口(Command):定义了一个统一的接口,用于执行命令。
  2. 具体命令类(ConcreteCommand):实现命令接口,封装具体的操作逻辑。
  3. 接收者(Receiver):实际执行命令的类,包含具体的操作实现。
  4. 调用者(Invoker):负责调用命令对象以执行请求。
  5. 客户端(Client):创建具体命令对象并将其绑定到接收者和调用者。

命令模式的使用场景

  1. 需要对行为进行封装时:将动作抽象成命令类对象。
  2. 支持撤销/重做功能:通过保存命令历史记录。
  3. 支持请求的排队和日志功能
  4. 需要将调用者与实际执行者解耦

示例:智能家居命令控制

假设我们有一个智能家居系统,可以通过命令模式来控制灯的开关操作。


1. 定义命令接口

// 命令接口
interface Command {
    void execute(); // 执行命令
    void undo();    // 撤销命令
}

2. 创建接收者(Receiver)

// 接收者:灯
class Light {
    public void turnOn() {
        System.out.println("灯已打开");
    }

    public void turnOff() {
        System.out.println("灯已关闭");
    }
}

3. 创建具体命令类

// 具体命令:打开灯
class TurnOnLightCommand implements Command {
    private Light light;

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

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

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

// 具体命令:关闭灯
class TurnOffLightCommand implements Command {
    private Light light;

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

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

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

4. 创建调用者(Invoker)

// 调用者:遥控器
class RemoteControl {
    private Command command;

    // 设置命令
    public void setCommand(Command command) {
        this.command = command;
    }

    // 执行命令
    public void pressButton() {
        if (command != null) {
            command.execute();
        }
    }

    // 撤销命令
    public void pressUndo() {
        if (command != null) {
            command.undo();
        }
    }
}

5. 客户端代码

public class CommandPatternExample {
    public static void main(String[] args) {
        // 创建接收者(灯)
        Light light = new Light();

        // 创建具体命令对象
        Command turnOnCommand = new TurnOnLightCommand(light);
        Command turnOffCommand = new TurnOffLightCommand(light);

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

        // 绑定打开灯命令并执行
        remote.setCommand(turnOnCommand);
        remote.pressButton(); // 输出:灯已打开

        // 撤销打开灯命令
        remote.pressUndo(); // 输出:灯已关闭

        // 绑定关闭灯命令并执行
        remote.setCommand(turnOffCommand);
        remote.pressButton(); // 输出:灯已关闭

        // 撤销关闭灯命令
        remote.pressUndo(); // 输出:灯已打开
    }
}

运行结果

灯已打开
灯已关闭
灯已关闭
灯已打开

优点

  1. 降低耦合:命令模式将请求发送者和实际执行者分离。
  2. 支持扩展:可以轻松增加新的命令,而无需修改已有代码。
  3. 支持撤销和重做:通过命令对象保存操作状态。

缺点

  1. 增加了类的数量:每个具体命令类都会新增一个类。
  2. 增加了系统的复杂性:特别是当命令较多时。

总结

命令模式通过将请求封装为命令对象,使得请求的发出者和接收者之间完全解耦。它特别适合在需要支持操作撤销、请求排队等功能的场景中应用。

posted @   庞某人  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· 【全网最全教程】使用最强DeepSeekR1+联网的火山引擎,没有生成长度限制,DeepSeek本体
点击右上角即可分享
微信分享提示