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

Java 設計模式:命令模式深度解析與電視遙控器實戰

     編輯:Java 相關知識

命令模式將「請求」封裝為物件,使客戶端能以不同請求參數化、支援佇列、日誌、撤銷/重做。本文透過「電視遙控器」經典案例,完整展示五大角色結構、程式碼實作、執行結果與優缺點分析,並探討何時該引入模式、何時該保持簡單。

五大核心角色

  • Command:抽象介面,宣告 execute()。
  • ConcreteCommand:具體命令,持有 Receiver 參考並實作 execute()。
  • Receiver:接收者,執行實際業務邏輯(如 Tv.turnOn())。
  • Invoker:調用者,持有命令物件並觸發執行(如遙控器)。
  • Client:客戶端,組裝命令與接收者,設定給調用者。

電視遙控器完整實作

// Command 介面
interface Command { void execute(); }

// Receiver:電視機
class Tv {
    int channel = 0;
    void turnOn()  { System.out.println("The television is on."); }
    void turnOff() { System.out.println("The television is off."); }
    void changeChannel(int c) { channel = c; System.out.println("Now TV channel is " + c); }
}

// ConcreteCommands
class CommandOn implements Command {
    private final Tv tv;
    CommandOn(Tv t) { tv = t; }
    public void execute() { tv.turnOn(); }
}
class CommandOff implements Command {
    private final Tv tv;
    CommandOff(Tv t) { tv = t; }
    public void execute() { tv.turnOff(); }
}
class CommandChange implements Command {
    private final Tv tv; private final int channel;
    CommandChange(Tv t, int c) { tv = t; channel = c; }
    public void execute() { tv.changeChannel(channel); }
}

// Invoker:遙控器
class Control {
    private final Command onCmd, offCmd, chgCmd;
    Control(Command on, Command off, Command chg) { onCmd=on; offCmd=off; chgCmd=chg; }
    void turnOn() { onCmd.execute(); }
    void turnOff() { offCmd.execute(); }
    void changeChannel() { chgCmd.execute(); }
}

// Client 組裝測試
public class Client {
    public static void main(String[] args) {
        Tv tv = new Tv();
        Control ctrl = new Control(new CommandOn(tv), new CommandOff(tv), new CommandChange(tv, 2));
        ctrl.turnOn(); ctrl.changeChannel(); ctrl.turnOff();
    }
}

執行結果

The television is on.
Now TV channel is 2
The television is off.

優缺點與設計取捨

優點缺點
封裝性佳,客戶端不需知曉執行細節命令類過多時類別爆炸,維護成本高
擴充性強,新增命令只需新增類別簡單邏輯引入模式屬於過度設計
支援佇列、日誌、Undo/Redo 進階功能間接層增加閱讀難度

何時使用?

  • 需要「請求-回應」解耦、支援撤銷/重做、命令佇列、日誌記錄。
  • 若目前單一 switch-case 或方法封裝已足夠,不要為了用模式而用模式——遵循 YAGNI 原則,重構時再引入。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved