📜  设计模式-命令模式(1)

📅  最后修改于: 2023-12-03 14:57:40.100000             🧑  作者: Mango

设计模式-命令模式 {#design-pattern-command-pattern}

什么是命令模式?

命令模式(Command Pattern)是一种行为型设计模式,它将请求封装为一个对象,从而使不同的请求可以对客户端进行参数化。

简而言之,命令模式可以将请求(即命令)与其执行者进行解耦,并且将请求封装成对象,以便于对请求进行参数化、队列化、记录日志、撤销等操作。

命令模式的组成部分

命令模式由以下组成部分:

  • Command(命令):是一个接口,它规定了命令对象的基本行为。通常它包含一个execute()方法,当调用这个方法时,命令对象会完成相应的操作。

  • Concrete Command(具体命令):是一个实现了Command接口的具体类,它负责执行实际的操作。

  • Invoker(调用者):它负责发出请求并调用命令对象执行请求。

  • Receiver(接收者):负责执行命令对象指定的操作。

  • Client(客户端):负责创建命令对象并将其传递给调用者执行。

命令模式的优点

命令模式的优点包括:

  • 松耦合:命令模式将命令和接收者完全解耦,使得两者之间的关联关系减少,从而更好地满足了“开放-封闭原则”。

  • 可扩展性:客户端通过调用Invoker的setCommand()方法传递不同的命令对象,使得系统更加灵活。

  • 可撤销:命令模式可以将命令对象进行队列化,从而可以实现撤销操作。

  • 记录日志:命令模式可以记录所有执行过的命令,便于调试。

命令模式的应用场景

命令模式通常适用于以下场景:

  • 执行命令的地方需要与命令的具体实现分离,使得这些具体实现可以更加容易地进行扩展。

  • 需要队列化、日志记录、撤销操作等功能。

  • 需要异步执行命令,例如可以将具体命令发送到远程服务器执行。

示例代码

以下是一个简单的Java代码示例,它演示了如何使用命令模式实现一个遥控器:

// 创建Receiver
class Light {
    public void on() {
        System.out.println("Light is on");
    }

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

// 创建Command接口
interface Command {
    void execute();
}

// 创建Concrete Command
class LightOnCommand implements Command {
    private Light light;

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

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

class LightOffCommand implements Command {
    private Light light;

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

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

// 创建Invoker
class RemoteController {
    private Command command;

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

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

// 创建Client
public class Client {
    public static void main(String[] args) {
        // 创建Receiver
        Light light = new Light();

        // 创建Concrete Command
        Command lightOnCommand = new LightOnCommand(light);
        Command lightOffCommand = new LightOffCommand(light);

        // 创建Invoker
        RemoteController remote = new RemoteController();
        remote.setCommand(lightOnCommand);
        remote.executeCommand();

        remote.setCommand(lightOffCommand);
        remote.executeCommand();
    }
}
参考资料