Java 中的命令模式示例

维基百科定义:

命令模式是一种行为设计模式,其中一个对象用于封装执行操作或稍后触发事件所需的所有信息

来自 dofactory 的 UML 图 :

https://i.stack.imgur.com/0JiTY.gif

基本组件和工作流程:

  1. Command 声明了一个像 execute() 这样的抽象命令的接口
  2. Receiver 知道如何执行特定命令
  3. Invoker 持有 ConcreteCommand,必须执行
  4. Client 创建 ConcreteCommand 并分配 Receiver
  5. ConcreteCommand 定义了 Command 和 Receiver 之间的绑定

通过这种方式,命令模式通过 Invoker 将 Sender (客户端)与 Receiver 分离。 Invoker 完全了解要执行哪个 Command , Command 知道要调用哪个 Receiver 来执行特定操作。 **** **** **** **** ****

代码段:

interface Command {
    void execute();
}
class Receiver {
    public void switchOn(){
        System.out.println("Switch on from:"+this.getClass().getSimpleName());
    }
}
class OnCommand implements Command{
    private Receiver receiver;

    public OnCommand(Receiver receiver){
        this.receiver = receiver;
    }
    public void execute(){
        receiver.switchOn();
    }
}
class Invoker {
    private Command command;
  
    public Invoker(Command command){
        this.command = command;
    }
    public void execute(){
        this.command.execute();
    }
}

class TV extends Receiver{
    
    public String toString(){
        return this.getClass().getSimpleName();
    }
}
class DVDPlayer extends Receiver{
    
    public String toString(){
        return this.getClass().getSimpleName();
    }
}

public class CommandDemoEx{
    public static void main(String args[]){
        // On command for TV with same invoker 
        Receiver receiver = new TV();
        Command onCommand = new OnCommand(receiver);
        Invoker invoker = new Invoker(onCommand);
        invoker.execute();
        
        // On command for DVDPlayer with same invoker 
        receiver = new DVDPlayer();
        onCommand = new OnCommand(receiver);
        invoker = new Invoker(onCommand);
        invoker.execute();            
    }
}

输出:

Switch on from:TV
Switch on from:DVDPlayer

说明:

在这个例子中,

  1. 命令界面定义了 execute() 方法。
  2. OnCommand 是 ConcreteCommand ,它实现了 execute() 方法。
  3. Receiver 是基类。
  4. TV 和 DVDPlayer 是两种类型的接收器,它们像 OnCommand 一样传递给 ConcreteCommand。
  5. Invoker 包含命令。这是将 Sender 与 Receiver 分离的关键。
  6. Invoker 接收 OnCommand - >,它调用 Receiver (TV)来执行此命令。

通过使用 Invoker,你可以打开电视和 DVDPlayer。如果你扩展此程序,你也关闭电视和 DVDPlayer。

关键用例:

  1. 实现回调机制
  2. 实现撤消和重做功能
  3. 保持命令的历史