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. 保持命令的歷史