3.2设计模式——Command 命令模式(行为性)

意图

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

结构

其中

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

适用性

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

代码示例

// 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
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值