设计模式-命令模式

命令模式:

命令模式(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 应用程序中的菜单项和按钮点击事件处理。
  • 命令行工具,每条命令对应一个具体的命令对象。
  • 事务系统,每个事务操作作为一条命令,支持事务的提交、回滚等。
相关推荐
敲代码的 蜡笔小新6 小时前
【行为型之命令模式】游戏开发实战——Unity可撤销系统与高级输入管理的架构秘钥
unity·设计模式·架构·命令模式
m0_555762906 小时前
D-Pointer(Pimpl)设计模式(指向实现的指针)
设计模式
小Mie不吃饭6 小时前
【23种设计模式】分类结构有哪些?
java·设计模式·设计规范
范纹杉想快点毕业16 小时前
以项目的方式学QT开发(三)——超详细讲解(120000多字详细讲解,涵盖qt大量知识)逐步更新!
c语言·开发语言·c++·qt·mysql·算法·命令模式
君鼎1 天前
C++设计模式——单例模式
c++·单例模式·设计模式
敲代码的 蜡笔小新1 天前
【行为型之中介者模式】游戏开发实战——Unity复杂系统协调与通信架构的核心秘诀
unity·设计模式·c#·中介者模式
令狐前生1 天前
设计模式学习整理
学习·设计模式
敲代码的 蜡笔小新1 天前
【行为型之解释器模式】游戏开发实战——Unity动态公式解析与脚本系统的架构奥秘
unity·设计模式·游戏引擎·解释器模式
JANYI20181 天前
嵌入式设计模式基础--C语言的继承封装与多态
java·c语言·设计模式
敲代码的 蜡笔小新1 天前
【行为型之观察者模式】游戏开发实战——Unity事件驱动架构的核心实现策略
观察者模式·unity·设计模式·c#