Skip to content

设计模式 - 命令模式

一、概念

1、定义

命令模式(Command Pattern)将请求封装成对象,以使不同的请求、队列或者操作能够参数化其他对象。命令模式属于行为型设计模式。

二、概要

1、主要角色

  • 命令(Command): 声明执行操作的接口。
  • 具体命令(Concrete Command): 实现命令接口,具体定义命令的执行逻辑。
  • 调用者(Invoker): 负责调用命令对象执行请求。
  • 接收者(Receiver): 知道如何实施与执行一个请求相关的操作。
  • 客户端(Client): 创建命令对象、设置命令的接收者,并将命令交给调用者执行。

三、示例代码

1、Java 示例

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

// 具体命令A
class ConcreteCommandA implements Command {
    private Receiver receiver;

    public ConcreteCommandA(Receiver receiver) {
        this.receiver = receiver;
    }

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

// 具体命令B
class ConcreteCommandB implements Command {
    private Receiver receiver;

    public ConcreteCommandB(Receiver receiver) {
        this.receiver = receiver;
    }

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

// 调用者
class Invoker {
    private Command command;

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

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

// 接收者
class Receiver {
    public void actionA() {
        System.out.println("Receiver: Performing action A");
    }

    public void actionB() {
        System.out.println("Receiver: Performing action B");
    }
}

// 客户端
public class Client {
    public static void main(String[] args) {
        Receiver receiver = new Receiver();

        Command commandA = new ConcreteCommandA(receiver);
        Command commandB = new ConcreteCommandB(receiver);

        Invoker invoker = new Invoker();

        invoker.setCommand(commandA);
        invoker.executeCommand();
        // Output:
        // Receiver: Performing action A

        invoker.setCommand(commandB);
        invoker.executeCommand();
        // Output:
        // Receiver: Performing action B
    }
}

2、JavaScript 示例

javascript
// 命令接口
class Command {
  execute() {
    console.log('Default Command: Executing command')
  }
}

// 具体命令A
class ConcreteCommandA extends Command {
  constructor(receiver) {
    super()
    this.receiver = receiver
  }

  execute() {
    this.receiver.actionA()
  }
}

// 具体命令B
class ConcreteCommandB extends Command {
  constructor(receiver) {
    super()
    this.receiver = receiver
  }

  execute() {
    this.receiver.actionB()
  }
}

// 调用者
class Invoker {
  setCommand(command) {
    this.command = command
  }

  executeCommand() {
    this.command.execute()
  }
}

// 接收者
class Receiver {
  actionA() {
    console.log('Receiver: Performing action A')
  }

  actionB() {
    console.log('Receiver: Performing action B')
  }
}

// 客户端
const receiver = new Receiver()

const commandA = new ConcreteCommandA(receiver)
const commandB = new ConcreteCommandB(receiver)

const invoker = new Invoker()

invoker.setCommand(commandA)
invoker.executeCommand()
// Output:
// Receiver: Performing action A

invoker.setCommand(commandB)
invoker.executeCommand()
// Output:
// Receiver: Performing action B

四、VUE 中实际用例

  • TODO
  • ...