📜  命令模式(1)

📅  最后修改于: 2023-12-03 15:23:00.314000             🧑  作者: Mango

命令模式

命令模式是一种行为设计模式,它可以将请求转换为一个包含请求的对象,从而使您可以根据需要将请求排队,记录请求历史记录,将请求动态地配置和执行操作。

实现方法

命令模式包含以下组件:

  • Command: 定义执行操作的接口。
  • ConcreteCommand: 实现Command接口并封装命令的执行者及其方法。
  • Receiver: 执行命令的对象。
  • Invoker: 调用命令的对象。
  • Client: 命令模式的使用者。
Command

Command是一个接口,它定义了一个名为execute的方法。该方法无需参数并在执行后产生某种效果。execute方法通常包括一个对接收方的调用。

public interface Command {
    void execute();
}
ConcreteCommand

ConcreteCommand实现了Command接口,它包含了要执行的操作和其接收方。它将用户命令与命令的执行者分离。

public class ConcreteCommand implements Command {
    private final Receiver receiver;
    
    public ConcreteCommand(Receiver receiver) {
        this.receiver = receiver;
    }

    @Override
    public void execute() {
        receiver.doSomething();
    }
}
Receiver

Receiver是执行实际操作的对象。它包含了实际执行操作的方法。

public class Receiver {
    public void doSomething() {
        // 实现操作的代码
    }
}
Invoker

Invoker是调用命令的对象。它传递一个命令对象并调用其execute方法。

public class Invoker {
    private Command command;

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

    public void executeCommand() {
        command.execute();
    }
}
Client

Client是命令模式的使用者。它负责创建ConcreteCommand对象并将其传递给Invoker。

public class Client {
    public static void main(String[] args) {
        Receiver receiver = new Receiver();
        Command command = new ConcreteCommand(receiver);
        Invoker invoker = new Invoker();
        invoker.setCommand(command);
        invoker.executeCommand();
    }
}
优点
  • 命令模式将命令的来源,命令执行和命令实现分离,使代码更具可维护性和可扩展性。
  • 命令模式将多个命令排队执行,从而使您可以轻松地实现撤消或重做操作。
  • 命令模式的代码易于扩展,添加新的命令只需要实现Command接口即可。
缺点
  • 添加了许多新的类和接口,使代码更加复杂。
  • 在某些情况下,该模式可能导致程序变慢,因为实现操作的过程需要在多个对象之间传递调用。
适用场景
  • 需要记录某些操作的历史记录以便以后撤消或重做。
  • 执行复杂的,具有许多参数的命令。
  • 将多个命令排队以在某些已知时间执行整批命令。
总结

命令模式是一个非常有用的模式,它将命令和命令的执行者分离,使代码更具可维护性和可扩展性。它还允许您轻松地实现撤消或重做操作。虽然该模式可能会增加代码的复杂性,但它已在许多业务场景中得到了广泛应用,并被证明是一种出色的设计模式。