行为型模式之命令模式

命令模式(Command Pattern)

命令模式是一种行为型设计模式,它将请求封装成一个对象,从而使你可以用不同的请求参数化其他对象,
并且能够支持请求的排队或记录日志、撤销操作等功能。

在命令模式中,有以下几个核心角色:
命令(Command):定义了执行操作的接口,通常包含一个执行(execute)方法。
具体命令(Concrete Command):实现了命令接口,负责具体的命令执行逻辑,并保留了执行该命令所需的相关上下文。
调用者(Invoker):负责调用命令对象来执行请求。
接收者(Receiver):真正执行命令的对象。具体命令中会包含对接收者的引用,用于调用接收者的方法执行操作。
客户端(Client):创建具体命令对象,并将其设置给调用者进行请求的发起。

提供demo版代码更容易理解

/**
 * @author zhou
 *  命令接口
 */
interface Command {
    void execute();
}

/**
 * @author zhou
 *  具体命令类A
 */
class ConcreteCommandA implements Command {
    private Receiver receiver;

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

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

/**
 * @author zhou
 *  具体命令类B
 */
class ConcreteCommandB implements Command {
    private Receiver receiver;

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

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

/**
 * @author zhou
 *  调用者类
 */
class Invoker {
    private Command command;

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

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

/**
 * @author zhou
 *  接收者类
 */
class Receiver {
    public void actionA() {
        System.out.println("执行操作A");
    }

    public void actionB() {
        System.out.println("执行操作B");
    }
}

/**
 * @author zhou
 *  客户端使用
 */
public class Main {
    public static void main(String[] args) {
        // 创建接收者对象
        Receiver receiver = new Receiver();

        // 创建具体命令对象A,并指定接收者
        Command commandA = new ConcreteCommandA(receiver);

        // 创建具体命令对象B,并指定接收者
        Command commandB = new ConcreteCommandB(receiver);

        // 创建调用者对象,并设置具体命令对象A
        Invoker invoker = new Invoker();
        invoker.setCommand(commandA);

        // 调用者执行命令A
        invoker.executeCommand();

        // 切换命令为B
        invoker.setCommand(commandB);

        // 调用者执行命令B
        invoker.executeCommand();
    }
}

我们定义了一个命令接口 Command,具体命令类 ConcreteCommandA 和 ConcreteCommandB 实现了该接口。
接收者类 Receiver 定义了实际执行动作的方法。调用者类 Invoker 中维护了一个命令对象,并通过 setCommand 方法设置具体的命令,executeCommand 方法调用命令对象的 execute 方法来执行具体的命令。

在 Main 类的 main 方法中,我们创建了一个接收者对象 Receiver,然后创建具体命令对象A并将接收者传入,再创建调用者对象 Invoker 并将具体命令A设置为命令对象,最后调用调用者的 executeCommand 方法来执行命令A的动作。
接着,我们创建具体命令对象B并设定接收者,将命令B设置为命令对象,并再次调用调用者的 executeCommand 方法来执行命令B的动作。

该示例展示了如何使用命令模式实现请求的封装和解耦,通过将请求封装成具体的命令对象,使得发送者和接收者的关系松耦合,增加了代码的灵活性和可扩展性。同时,命令模式也支持对请求进行撤销、队列化、记录日志等操作。

你可能感兴趣的:(计算机基础,命令模式)