命令模式(Command Pattern)

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

体现的设计原则

  1. 单一职责原则:每个命令类只负责处理一个具体的请求,从而简化了每个类的职责。
  2. 开闭原则:可以在不修改现有代码的情况下扩展系统的功能,通过添加新的命令类来实现新功能。
  3. 解耦:请求的发送者和接收者之间没有直接依赖关系,增强了系统的灵活性。

示例场景

假设我们正在开发一个遥控器系统,可以控制多种家电设备(如灯、电视等)。每个按钮都可以绑定不同的命令,按下按钮时执行相应的操作。

Java 代码示例

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    public void pressUndo() {
        command.undo();
    }
}

// 客户端代码
public class CommandPatternDemo {
    public static void main(String[] args) {
        // 创建接收者
        Light light = new Light();

        // 创建命令
        Command lightOn = new LightOnCommand(light);
        Command lightOff = new LightOffCommand(light);

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

        // 绑定并执行命令
        remote.setCommand(lightOn);
        remote.pressButton(); // 打开灯

        remote.setCommand(lightOff);
        remote.pressButton(); // 关闭灯

        // 撤销上一步操作
        remote.pressUndo();   // 恢复灯的状态
    }
}

在这个例子中:

  • Command 是命令接口,定义了所有具体命令共有的方法 executeundo
  • Light 是接收者类,负责实际执行操作(如打开或关闭灯)。
  • LightOnCommandLightOffCommand 是具体命令类,分别实现了打开灯和关闭灯的操作。
  • RemoteControl 是调用者类,负责设置和触发命令。它可以绑定不同的命令并在按下按钮时执行相应操作。
  • 在客户端代码中,创建了一个遥控器并将不同的命令绑定到按钮上。按下按钮时执行命令,按撤销按钮时执行撤销操作。

这样,我们可以通过命令模式将请求封装成对象,从而实现请求的灵活管理和操作。

你可能感兴趣的:(深入解读软件设计模式,命令模式,java,设计模式)