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