命令模式(Command Pattern)又稱為行動(Action)模式或交易(Transaction)模式。 定義: 將一個請求封裝成一個對象,從而讓你使用不同的請求把客戶端參數化,對請求排隊或記錄請求日誌,可以提供命令的撤銷和恢復功能。 命令模式類圖如下所示。 命令模式中有如下4個角色。 命令( ...
命令模式(Command Pattern)又稱為行動(Action)模式或交易(Transaction)模式。
定義:
- 將一個請求封裝成一個對象,從而讓你使用不同的請求把客戶端參數化,對請求排隊或記錄請求日誌,可以提供命令的撤銷和恢復功能。
命令模式類圖如下所示。
命令模式中有如下4個角色。
- 命令(Command)角色:聲明一個所有具體命令類的抽象介面,定義需要執行的命令。
- 具體命令(Concrete Command)角色:定義一個接收者和行為之間的弱耦合,實現命令方法,並調用接收者的相應操作。
- 調用者(Invoker)角色:負責調用命令對象執行請求。
- 接收者(Receiver)角色:負責具體實施和執行一個請求。
Command.java
public interface Command { // 執行命令的方法 public void execute(); }
ConcreteCommand.java
public class ConcreteCommand implements Command{ private Receiver receiver; public ConcreteCommand(Receiver receiver) { this.receiver = receiver; } // 執行方法 @Override public void execute() { this.receiver.action(); } }
Receiver.java
public class Receiver { // 行動方法 public void action() { System.out.println("執行動作"); } }
Invoker.java
public class Invoker { private Command command; // 接收命令 protected void setCommand(Command command) { this.command = command; } // 執行命令 public void action() { this.command.execute(); } }
Client.java
public class Client { public static void main(String[] args) { // 調用者 Invoker invoker = new Invoker(); // 接收者 Receiver receiver = new Receiver(); // 定義一個發送給接收者的命令 Command command = new ConcreteCommand(receiver); // 執行 invoker.setCommand(command); invoker.action(); } }
優點:
- 類間解綁。調用者角色與接收者角色之間沒有任何依賴,調用者實現功能時只需調用Command中的execute()方法即可,不需要瞭解是哪個接收者執行。
- 可擴展性。Command的子類可以非常容易地擴展,而調用者Invoker和高層次的模塊Client不產生嚴重的代碼耦合。
- 命令模式結合其他模式會更優秀。命令模式可以結合責任鏈模式,實現命令族解析任務,結合模板實現方法,則可以減少Command子類的膨脹問題。
缺點:
- 可能會導致系統中出現過多的具體命令類,因此需要在項目中慎重考慮使用。
應用場景:
-
只要你認為是命令的地方就可以採用命令模式,例如,在GUI開發中,一個按鈕的點擊
是一個命令,可以採用命令模式;模擬DOS命令的時候,當然也要採用命令模式;觸發-反
饋機制的處理等。
摘自:
青島東合信息技術有限公司 . 設計模式(Java版) . 電子工業出版社,2012,142-146.
秦小波 . 設計模式之禪 . 機械工業出版社, 2014