首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 命令模式深度解析:解耦請求與執行的藝術

     編輯:Java 相關知識

什麼是命令模式?

命令模式將「請求」封裝為一個獨立對象,從而使您能以不同的請求參數化客戶端、將請求排入佇列、記錄請求日誌、以及支援可撤銷的操作。其核心在於將「行為的請求者」與「行為的實現者」解耦,實現雙方的鬆耦合。

核心角色

  • Command(命令介面):宣告執行操作的介面,通常只有一個 execute() 方法。
  • ConcreteCommand(具體命令):實現命令介面,內部持有接收者引用,調用接收者的具體業務邏輯。
  • Receiver(接收者):真正執行命令邏輯的對象,任何類別都可成為接收者。
  • Invoker(調用者/觸發者):持有命令對象,負責觸發命令執行,客戶端實際與之互動。
  • Client(組裝者):建立具體命令並設定其接收者,將命令傳給調用者。注意這不是傳統意義的「客戶端」,更像是系統的組裝器。

優缺點

優點

  1. 降低物件間耦合度,請求者無需知道接收者細節。
  2. 新增命令極易,符合開閉原則。
  3. 可組合命令實現宏命令(組合模式應用)。
  4. 支援撤銷/重做、佇列執行、日誌記錄等進階功能。

缺點

每個命令需一個具體類別,可能導致類別數量膨脹,增加系統複雜度。

適用場景

  • 需將請求調用者與接收者解耦。
  • 需在不同時刻指定、排隊、執行請求。
  • 需支援 Undo/Redo 操作。
  • 需將一組操作組合為宏命令。

實戰範例:電視遙控器

模擬電視的開機、關機、換台操作。

1. 定義命令介面

public interface Command {
    void execute();
}

2. 接收者:電視類

public class Tv {
    private int currentChannel = 0;

    public void turnOn()  { System.out.println("電視開啟"); }
    public void turnOff() { System.out.println("電視關閉"); }
    public void changeChannel(int channel) {
        this.currentChannel = channel;
        System.out.println("當前頻道:" + channel);
    }
}

3. 具體命令類別

public class CommandOn implements Command {
    private Tv tv;
    public CommandOn(Tv tv) { this.tv = tv; }
    public void execute() { tv.turnOn(); }
}

public class CommandOff implements Command {
    private Tv tv;
    public CommandOff(Tv tv) { this.tv = tv; }
    public void execute() { tv.turnOff(); }
}

public class CommandChange implements Command {
    private Tv tv;
    private int channel;
    public CommandChange(Tv tv, int channel) { this.tv = tv; this.channel = channel; }
    public void execute() { tv.changeChannel(channel); }
}

4. 調用者:遙控器

public class RemoteControl {
    private Command onCmd, offCmd, changeCmd;
    public RemoteControl(Command on, Command off, Command change) {
        this.onCmd = on; this.offCmd = off; this.changeCmd = change;
    }
    public void turnOn()      { onCmd.execute(); }
    public void turnOff()     { offCmd.execute(); }
    public void changeChannel() { changeCmd.execute(); }
}

5. 客戶端組裝與測試

public class Client {
    public static void main(String[] args) {
        Tv tv = new Tv();                     // 接收者
        Command on = new CommandOn(tv);       // 具體命令
        Command off = new CommandOff(tv);
        Command chg = new CommandChange(tv, 5);

        RemoteControl rc = new RemoteControl(on, off, chg); // 調用者
        rc.turnOn();        // 輸出:電視開啟
        rc.changeChannel(); // 輸出:當前頻道:5
        rc.turnOff();       // 輸出:電視關閉
    }
}

總結

  1. 命令模式本質:將命令封裝,分離「發出請求」與「執行請求」的責任。
  2. 每個命令都是一個操作物件,可被儲存、傳遞、排隊、記錄。
  3. 引入抽象命令介面,發送者面向介面編程,具體命令與接收者綁定。
  4. 適合需要解耦、支援撤銷/重做、宏命令、佇列執行的場景。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved