设计模式-命令模式

命令模式:

命令模式(Command Pattern)是属于行为型的设计模式,它将请求封装为一个对象,使用户可以参数化其他对象的方法调用、队列或记录请求日志,以及支持可撤销的操作。这种模式把发出请求的责任和执行请求的对象分离开来。

角色与结构:

1 Command(命令接口/抽象命令类)

  • 定义执行操作的接口,通常声明一个 execute() 方法,所有具体命令类都必须实现这个方法。

2 ConcreteCommand(具体命令类)

  • 实现了 Command 接口,绑定一个接收者对象,并且在 execute() 方法中调用接收者的相应操作以完成请求。

3 Receiver(接收者)

  • 执行命令动作的实际对象,知道如何执行命令请求。任何类都可以成为接收者。

4 Invoker(调用者)

  • 负责调用命令对象执行请求,通常持有命令对象的引用并提供用于执行命令的方法。

工作原理:

  • 当客户端创建一个具体命令对象时,会将其与接收者对象关联起来。
  • 客户端通过调用者对象将命令传递给它。
  • 调用者在需要时调用命令对象的 execute() 方法,从而间接调用接收者的业务方法执行操作。

示例代码:

命令模式java示例代码:

java 复制代码
// 命令接口
interface Command {
    void execute();
}

// 具体命令类
class ConcreteCommand implements Command {
    private Receiver receiver;

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

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

// 接收者
class Receiver {
    public void action() {
        System.out.println("Executing the command...");
    }
}

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

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

    public void executeCommand() {
        if (command != null) {
            command.execute();
        }
    }
}

// 客户端代码
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(); // 输出 "Executing the command..."
    }
}

说明:在上面的代码中ConcreteCommand 类将 Receiver 对象的动作封装到其 execute() 方法中。当 Invoker 对象调用 executeCommand() 时,实际执行的是接收者的 action() 方法。

优点:

  • 降低耦合度:调用者和接收者之间通过命令对象解耦,使得它们无需直接相互依赖。
  • 增加新的命令容易:只需要定义一个新的具体命令类即可,调用者对新命令一无所知。
  • 支持命令队列和撤销/重做功能:由于每个命令都是独立的对象,可以将多个命令存储在一个队列中,然后依次执行;同时,如果命令对象还实现了撤销和重做的逻辑,就可以方便地支持这些功能。

应用场景:

  • GUI 应用程序中的菜单项和按钮点击事件处理。
  • 命令行工具,每条命令对应一个具体的命令对象。
  • 事务系统,每个事务操作作为一条命令,支持事务的提交、回滚等。
相关推荐
杨充13 小时前
10.可测试性实战设计
设计模式·开源·代码规范
杨充13 小时前
9.重构十二式的实战
设计模式·开源·代码规范
杨充13 小时前
6.设计原则的全景图
设计模式·开源·全栈
杨充13 小时前
2.面向对象的特性
设计模式
杨充13 小时前
7.SOLID原则案例汇
设计模式·开源·全栈
杨充13 小时前
8.反模式与坏味道
设计模式·开源·代码规范
杨充14 小时前
3.接口vs抽象类比较
设计模式
咖啡八杯17 小时前
文法、BNF与AST
java·设计模式·解释器模式·ast·文法
咖啡八杯1 天前
GoF设计模式——解释器模式
java·后端·spring·设计模式