设计模式-命令模式

命令模式(Command Pattern)是一种行为设计模式,它将请求封装成一个对象,从而让你可以用不同的请求对客户进行参数化,队列化请求或者记录请求日志,以及支持可撤销的操作。在命令模式中,一个请求(命令)被封装为一个对象,该对象负责调用接收者对象的某个方法来执行请求。

下面是一个简单的命令模式实现示例,包括命令接口、具体命令类、接收者类和调用者(Invoker)类。

1. 命令接口 (`Command`)

public interface Command {
    void execute();
}

2. 具体命令类 (`LightOnCommand` 和 `LightOffCommand`)

public class LightOnCommand implements Command {
    private final Light light;

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

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

public class LightOffCommand implements Command {
    private final Light light;

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

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

3. 接收者类 (`Light`)

public class Light {
    public void turnOn() {
        System.out.println("Light is on");
    }

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

4. 调用者类 (`RemoteControl`)

public class RemoteControl {
    private Command slot;

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

    public void buttonWasPressed() {
        slot.execute();
    }
}

5. 使用示例

public class Main {
    public static void main(String[] args) {
        Light light = new Light();
        Command lightOn = new LightOnCommand(light);
        Command lightOff = new LightOffCommand(light);

        RemoteControl remoteControl = new RemoteControl();
        remoteControl.setCommand(lightOn);
        remoteControl.buttonWasPressed(); 

        remoteControl.setCommand(lightOff);
        remoteControl.buttonWasPressed(); 
    }
}

命令模式是一种强大的设计模式,特别适用于需要支持多个操作请求、队列请求、日志记录或撤销操作的场景。通过将请求封装成命令对象,它提供了高度的灵活性和扩展性,同时也保持了系统的松耦合。然而,使用时需权衡其带来的系统复杂度增加是否符合项目需求。

6. 优点

  1. 松耦合:命令模式将发出请求的对象与执行请求的对象解耦,使得两者之间没有直接引用。
  2. 扩展性好:容易添加新的命令或新的接收者,符合开闭原则。
  3. 易于管理:可以轻松地将命令放入队列、记录日志或支持撤销操作。

7. 缺点

  1. 增加系统复杂性:引入了大量的命令和接收者类,对于简单的情况可能显得冗余。
  2. 可能难以理解:初学者可能会觉得命令模式的概念和结构较为复杂。