Java 中的命令模式示例

维基百科定义:

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

来自 dofactory 的 UML 图 :

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

基本组件和工作流程:

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

通过这种方式,命令模式通过 InvokerSender (客户端)与 Receiver 分离。 Invoker 完全了解要执行哪个 CommandCommand 知道要调用哪个 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. OnCommandConcreteCommand ,它实现了 execute() 方法。
  3. Receiver 是基类。
  4. TVDVDPlayer 是两种类型的接收器,它们像 OnCommand 一样传递给 ConcreteCommand。
  5. Invoker 包含命令。这是将 Sender 与 Receiver 分离的关键。
  6. Invoker 接收 OnCommand - >,它调用 Receiver (TV)来执行此命令。

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

关键用例:

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