行为型模式-4.命令模式(Command Pattern)

 2024-07-29    0 条评论    71 浏览

设计模式

命令模式(Command Pattern)是一种行为设计模式,它允许将请求封装成一个对象,从而使不同的请求可以进行参数化,队列化,或者记录日志,以及支持可撤销的操作。这种模式的核心思想是将方法调用、请求或操作封装到单一对象中,从而允许系统使用不同的请求来参数化其他对象,并且支持将请求排队、记录请求日志、撤销操作等。

1. 经典命令模式结构

在命令模式中,通常包含以下角色:

  • Command(命令): 定义执行操作的接口。
  • ConcreteCommand(具体命令): 将一个接收者对象绑定于一个动作,调用接收者相应的操作,实现 Command 接口。
  • Invoker(调用者): 要求命令执行请求的对象。
  • Receiver(接收者): 知道如何实施与执行一个请求相关的操作。任何类都可能成为一个接收者。

2. Java 代码示例

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

定义命令接口和具体命令类

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

// 具体命令类,实现 Command 接口
public class LightOnCommand implements Command {
    private Light light;

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

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

// 接收者类,实现实际的操作
public class Light {
    public void turnOn() {
        System.out.println("灯被打开了");
    }

    public void turnOff() {
        System.out.println("灯被关闭了");
    }
}

调用者和客户端代码

// 调用者,负责调用命令
public class RemoteControl {
    private Command command;

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

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

// 客户端代码,使用命令模式
public class Client {
    public static void main(String[] args) {
        // 创建接收者对象
        Light light = new Light();

        // 创建具体命令对象,将接收者对象传递给它
        Command lightOnCommand = new LightOnCommand(light);

        // 创建调用者对象,将具体命令对象传递给它
        RemoteControl remoteControl = new RemoteControl();
        remoteControl.setCommand(lightOnCommand);

        // 调用者通过具体命令执行操作
        remoteControl.pressButton();
    }
}

在上面的示例中:

  • Command 接口定义了 execute() 方法,所有具体命令类都实现这个接口。
  • LightOnCommand 是一个具体的命令类,它持有一个 Light 对象,并在 execute() 方法中调用 Light 对象的 turnOn() 方法。
  • RemoteControl 是调用者,它可以接受任何实现了 Command 接口的命令,并通过 pressButton() 方法来执行命令。

这样的设计使得 RemoteControl 不需要知道具体命令的实现细节,只需通过接口调用执行命令即可,从而实现了命令的封装和解耦。

命令模式在实际应用中常见于菜单项、按钮操作等场景,它的优势在于支持命令的队列化、延迟执行、撤销和重做等功能,同时也使得系统更易于扩展和维护。