2023年10月21日 1 分钟阅读

命令模式(Command Pattern)

tinyash 0 条评论
blog10

命令模式是一种行为设计模式,它将请求封装为对象,从而允许我们用不同的请求、队列和日志请求等参数化其他对象。命令模式也可以支持可撤销的操作。

结构

  • 命令接口(Command): 定义了执行请求的方法。
public interface Command {
    void execute();
}
  • 具体命令类(Concrete Command): 实现了命令接口,具体定义了如何执行请求。
public class LightOnCommand implements Command {
    private Light light;

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

    public void execute() {
        light.turnOn();
    }
}
  • 接收者类(Receiver): 实际执行请求的对象。
public class Light {
    public void turnOn() {
        System.out.println("Light is ON");
    }

    public void turnOff() {
        System.out.println("Light is OFF");
    }
}
  • 调用者类(Invoker): 负责调用命令对象执行请求。
public class RemoteControl {
    private Command command;

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

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

优点和缺点

优点:

  1. 松耦合: 将请求发送者和接收者解耦,请求发送者不需要知道接收者的具体实现,降低了两者之间的耦合度。
  2. 可扩展性: 可以方便地新增命令类和接收者类,不影响已有的代码。
  3. 可撤销的操作: 命令模式支持可撤销的操作,通过保存历史命令,可以实现撤销和重做操作。
  4. 支持队列操作: 可以将命令对象排队,从而支持对请求的排队和记录。

缺点:

  1. 类过多: 引入了很多具体命令类和接收者类,可能导致类的数量增多。
  2. 理解和使用较复杂: 对于简单的场景,命令模式可能会显得过于复杂。

示例

以下是一个简单的命令模式的示例,模拟了一个遥控器控制电灯的操作。

// 命令接口
public interface Command {
    void execute();
}

// 具体命令类 - 开灯命令
public class LightOnCommand implements Command {
    private Light light;

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

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

// 接收者类 - 电灯
public class Light {
    public void turnOn() {
        System.out.println("Light is ON");
    }

    public void turnOff() {
        System.out.println("Light is OFF");
    }
}

// 调用者类 - 遥控器
public class RemoteControl {
    private Command command;

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

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

// 客户端代码
public class Main {
    public static void main(String[] args) {
        Light light = new Light();
        Command lightOnCommand = new LightOnCommand(light);

        RemoteControl remoteControl = new RemoteControl();
        remoteControl.setCommand(lightOnCommand);

        remoteControl.pressButton(); // 输出:Light is ON
    }
}

在这个示例中,Command 是命令接口,LightOnCommand 是具体的开灯命令类,Light 是接收者类,负责实际执行命令。RemoteControl 是调用者类,通过设置不同的命令对象,可以控制不同的操作。当遥控器按下按钮时,会执行相应的命令,从而控制电灯的开关。

精选推荐 RECOMMEND
阿里云
前往领券

☁️ 阿里云新客专享

🎁 新用户 8 折优惠,云服务器、建站套餐都能省一笔

新用户专享,个人建站从这里开始

腾讯云
点击查看

🚀 腾讯云活动专区

💻 4核4G服务器新客 38元/年起,香港地域低至 6.5 折/月

活动价格以官网为准

🙋 AI焕新季,马上用千问

🧩 AI 大模型入门套餐首购低至 4.5 折

领1728元礼包

阿里云
领养龙虾

🦞 OpenClaw

⚡ 分钟级部署 OpenClaw,低至 68 元 1 年,专属你的 AI 管家

自动帮你干活,适合个人和团队

发表评论

你的邮箱地址不会被公开,带 * 的为必填项。

工具站推荐 TINYASH TOOL HUB

效率工具,一站直达

常用工具都在这里,打开即用 www.tinyash.com/tool

Markdown 图片处理 开发调试 效率工具