命令模式將一個請求或操作封裝為一個對象,使得我們可以用不同的請求對客戶端進行參數化,對請求進行排隊或記錄請求日誌,並支援命令的撤銷與恢復功能。這是一種行為型設計模式,核心在於「將行為封裝為對象」。
想像一家公司的運作:老闆發布命令,中層主管接收後指派給具體員工執行。這個流程中,關鍵在於「命令」本身。若我們將命令抽離出來,封裝為獨立對象,便能實現發布者與執行者的解耦。無論命令來自 CEO、人資部還是其他來源;無論執行者是張三還是李四,系統都能靈活擴展。這正是哲學上所謂的「抓住主要矛盾」。
命令模式包含四個核心角色:
public interface ICommand {
void execute();
}
public class ConcreteCommand implements ICommand {
private Receiver receiver;
public ConcreteCommand(Receiver receiver) { this.receiver = receiver; }
@Override public void execute() { receiver.action(); }
}
public class Receiver {
public void action() { System.out.println("Receiver 執行具體業務"); }
}
public class Invoker {
private ICommand command;
public Invoker(ICommand command) { this.command = command; }
public void invoke() { command.execute(); }
}
public class Test {
public static void main(String[] args) {
Receiver receiver = new Receiver();
ICommand command = new ConcreteCommand(receiver);
Invoker invoker = new Invoker(command);
invoker.invoke();
}
}
可能導致過多具體命令類別膨脹,增加系統複雜度。
當需要將請求發送者與接收者解耦、支援操作記錄/撤銷、或需實現宏命令(組合多個命令)時,命令模式是最佳選擇。