Command 命令

意图

讲一个请求封装为一个对象,从而使得可以用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。

结构

其中

  • Command声明执行操作的接口。
  • ConcreteCommand将一个接收者对象绑定于一个动作;调用接收者相应的操作,以实现Execute。
  • Client创建一个具体命令对象并设定它的接收者。
  • Invoker(调用者)要求该命令执行这个请求。
  • Receiver(接收者)知道如何实施与执行一个请求相关的操作。任何类都可能作为一个接收者。

适用性

  • 抽象出待执行的动作以参数化某对象,Command模式是过程语言中的回调(Callback)机制的一个面向对象的替代品
  • 在不同的时刻指定、排列和执行请求。一个Command对象可以有一个与初始请求无关的生存期。如果一个请求的接收者可用一种与地址空间无关的方法表达,那么就可以将负责该请求的命令对象传递给另一个不同的进程并在那实现该请求。
  • 支持取消操作。Command的Execute(执行)操作可在实施操作前将状态存储起来,在取消操作时这个状态用来消除该操作的影响。Command接口必须添加一个Unexecute操作,该操作取消上一次Execute调用的效果。执行的命令被储存在一个历史列表中。可通过向后和向前遍历这一列表并分别调用Unexecute和Execute来实现重数不限的"取消"和"重做"。
  • 支持修改日志。这样当系统崩溃时,这些修改可以被重做一遍。在Command接口中添加装载操作和存储操作,可以用来保持变动的一个一致的修改日志。从崩溃中恢复的过程包括从磁盘中重新读入记录下来的命令并用Execute操作重新执行他们。
  • 用构建在原语操作的高层操作构造一个系统。这个样一种结构在支持事务(Transaction)的信息系统中很常见。Command模式提供了对事物进行建模的方法。Command有一个公共接口,使得可以用一种方式调用所有事物,同时使用该模式也易于添加新事物扩展系统。

代码示例

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

// AddCommand 类
class AddCommand implements Command {
    private int a;
    private int b;

    public AddCommand(int a, int b) {
        this.a = a;
        this.b = b;
    }

    @Override
    public void execute() {
        System.out.println("执行加法操作: " + (a + b));
    }
}

// SubCommand 类
class SubCommand implements Command {
    private int a;
    private int b;

    public SubCommand(int a, int b) {
        this.a = a;
        this.b = b;
    }

    @Override
    public void execute() {
        System.out.println("执行减法操作: " + (a - b));
    }
}

// Invoker 类
class Calculator {
    private Command command;

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

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

// Client 类
public class Main {
    public static void main(String[] args) {
        Calculator calculator = new Calculator();

        Command addCommand = new AddCommand(5, 3);
        Command subCommand = new SubCommand(10, 2);

        calculator.setCommand(addCommand);
        calculator.executeCommand(); // 输出:执行加法操作: 8

        calculator.setCommand(subCommand);
        calculator.executeCommand(); // 输出:执行减法操作: 8
    }
}

代码设计注释

  • Command 接口: 定义了所有命令都需要实现的 execute() 方法,用于执行命令的具体操作。
  • AddCommand 和 SubCommand 类: 实现了 Command 接口,分别代表加法和减法操作。
  • Calculator 类: 作为 Invoker,负责接收和执行命令。它包含一个 command 属性,用于存储当前要执行的命令。
  • Main 类: 作为 Client,负责创建命令对象和 Invoker 对象,并调用 Invoker 的 executeCommand() 方法执行命令。

优点

  • 解耦: 命令设计模式将请求和执行解耦,使得请求和执行可以独立开发和修改。
  • 可扩展性: 可以轻松添加新的命令,而无需修改现有的代码。
  • 可重用性: 可以将命令对象重复使用,减少代码冗余。

缺点

  • 复杂性: 在简单的情况下,使用命令设计模式可能会增加代码的复杂性。
  • 性能: 命令对象可能会引入额外的内存开销和性能损耗。
相关推荐
懒洋洋大魔王14 分钟前
7.Java高级编程 多线程
java·开发语言·jvm
茶馆大橘18 分钟前
【黑马点评】已解决java.lang.NullPointerException异常
java·开发语言
星辰@Sea22 分钟前
服务注册中心对比及使用场景分析
java·云原生
马剑威(威哥爱编程)25 分钟前
除了递归算法,要如何优化实现文件搜索功能
java·开发语言·算法·递归算法·威哥爱编程·memoization
yunhuibin26 分钟前
ffmpeg面向对象——参数配置秘密探索及其设计模式
学习·设计模式·ffmpeg
bug菌¹28 分钟前
滚雪球学SpringCloud[4.1讲]: Spring Cloud Gateway详解
java·spring cloud·微服务
MuseLss1 小时前
HashMap高频面试知识点
java·开发语言·哈希算法
tyler-泰勒1 小时前
初始c++:入门基础(完结)
java·开发语言·c++
重生之我要进大厂1 小时前
LeetCode 876
java·开发语言·数据结构·算法·leetcode
_祝你今天愉快1 小时前
技术成神之路:设计模式(十四)享元模式
java·设计模式