1.命令模式的定義
Encapsulate a request as an object,there by letting you parameterize clients with different requests,queue or log requests,and support undoable operations.
將請求封裝成一個對象,從而讓你使用不同的請求把客戶端參數化,對請求排隊或者記錄請求日誌,可提供命令的撤銷和恢復功能。
2.命令模式的通用類圖
命令模式通用類圖如下:
在類圖中的三個角色描述如下:
Receiver:
命令接受者,執行命令的對象
Command:
具體命令的包裝類,所有命令都在此類中聲明
Invoker:
接收到命令,並且執行命令,充當管理者的角色
相關代碼如下:
Receiver:
public abstract class Receiver { /** * 命令的具體執行者 */ public abstract void doSomething(); }
ConcreteReceiver:
public class ConcreteReceiver extends Receiver { @Override public void doSomething() { System.out.println("Do something."); } }
Command:
public abstract class Command { /** * 執行命令 */ public abstract void executor(); }
ConcreteCommand:
public class ConcreteCommand extends Command { private Receiver receiver; ConcreteCommand(Receiver receiver) { this.receiver = receiver; } @Override public void executor() { this.receiver.doSomething(); } }
Invoker:
public class Invoker { private Command command; public Invoker() { } public void action(){ this.command.executor(); } public void setCommand(Command command) { this.command = command; } }
Client:
public class Client { public static void main(String[] args) throws Exception { Invoker invoker = new Invoker(); Receiver receiver = new ConcreteReceiver(); Command command = new ConcreteCommand(receiver); invoker.setCommand(command); invoker.action(); } }
3.命令模式的優缺點
優點: 調用者和接受者之間的解藕 Command可以有多個子類,可擴展性比較高
缺點: 當命令比較多的時候,會出現Command有N個子類的情況
4.命令模式的使用場景
GUI事件監聽、Spring的事件監聽、Redis的pub/sub等