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

Java 設計模式之命令模式介紹

     編輯:Java 相關知識

命令模式:將請求封裝為對象,支持撤銷、隊列、日誌

命令模式 屬於行為型模式。它將「請求」封裝為一個對象,從而用不同的請求、隊列、日誌來參數化其他對象,並支持可撤銷的操作。核心思想:將「調用者」與「接收者」解耦,請求本身成為一個獨立對象。

核心角色

  • Command (抽象命令接口):聲明 execute() (及可選 undo())。
  • ConcreteCommand (具體命令):綁定接收者與動作,實現 execute() 調用接收者方法。
  • Receiver (接收者):執行實際業務邏輯的對象。
  • Invoker (調用者/發起者):持有命令對象,觸發 execute(),不關心具體實現。
  • Client (客戶端):創建命令、設置接收者、配置調用者。

代碼範例:智能家電遙控器 (支持撤銷)


// 1. 接收者:電燈
public class Light {
    public void on() { System.out.println("燈 開啟"); }
    public void off() { System.out.println("燈 關閉"); }
}

// 2. 命令接口
public interface Command {
    void execute();
    void undo();
}

// 3. 具體命令
public class LightOnCommand implements Command {
    private Light light;
    public LightOnCommand(Light light) { this.light = light; }
    @Override public void execute() { light.on(); }
    @Override public void undo() { light.off(); }
}
public class LightOffCommand implements Command {
    private Light light;
    public LightOffCommand(Light light) { this.light = light; }
    @Override public void execute() { light.off(); }
    @Override public void undo() { light.on(); }
}

// 4. 調用者:遙控器 (支持撤銷)
public class RemoteControl {
    private Command[] onCommands;
    private Command[] offCommands;
    private Command undoCommand; // 記錄最後一條命令

    public RemoteControl(int slots) {
        onCommands = new Command[slots];
        offCommands = new Command[slots];
        // 初始化空命令 (空對象模式)
        Command noCommand = new NoCommand();
        Arrays.fill(onCommands, noCommand);
        Arrays.fill(offCommands, noCommand);
        undoCommand = noCommand;
    }

    public void setCommand(int slot, Command onCmd, Command offCmd) {
        onCommands[slot] = onCmd;
        offCommands[slot] = offCmd;
    }

    public void onButtonPressed(int slot) {
        onCommands[slot].execute();
        undoCommand = onCommands[slot];
    }
    public void offButtonPressed(int slot) {
        offCommands[slot].execute();
        undoCommand = offCommands[slot];
    }
    public void undoButtonPressed() {
        undoCommand.undo();
    }
}

// 5. 空命令 (避免 null 判斷)
public class NoCommand implements Command {
    @Override public void execute() {}
    @Override public void undo() {}
}

// 6. 客戶端
public class Client {
    public static void main(String[] args) {
        RemoteControl remote = new RemoteControl(2);
        Light livingRoomLight = new Light();

        remote.setCommand(0, new LightOnCommand(livingRoomLight), new LightOffCommand(livingRoomLight));

        remote.onButtonPressed(0);  // 燈 開啟
        remote.offButtonPressed(0); // 燈 關閉
        remote.undoButtonPressed(); // 撤銷 -> 燈 開啟
    }
}

進階應用

  • 宏命令:組合多個命令,execute() 循環調用,undo() 逆序調用。
  • 命令隊列:異步執行、任務調度、線程池提交 Runnable (本質是命令)。
  • 日誌/持久化:命令對象可序列化,支持崩溃恢復、操作審計。
  • GUI 菜單/工具欄:Swing Action、JavaFX Command 均為命令模式應用。

模式優勢

  • 調用者與接收者解耦。
  • 新增命令無需修改調用者 (開閉原則)。
  • 支持撤銷/重做、隊列、日誌、事務等高級功能。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved