定義
将一個請求封裝為一個對象,使送出請求的責任和執行請求的責任分割開。這樣兩者之間通過指令對象進行溝通,這樣友善将指令對象進行儲存、傳遞、調用、增加與管理。
假設現在有一個請求處理類(低層類/第三方類),如果用戶端拿到這個類之後直接調用它,那麼用戶端和這個請求處理類之間的藕合度過高。這時候我們在用戶端的請求發送類和請求處理類之間增加一個Invoker類,再将請求發送類發送的所有請求封裝成對象,然後讓Invoker類去管理這些請求對象,并決定這些請求是否允許執行、何時執行、按什麼順序執行。
由于在請求發送類和請求處理類之間增加了請求轉發者,是以這兩個類之間的藕合度就大大降低。
優點:
- 降低系統的耦合度。指令模式能将調用操作的對象與實作該操作的對象解耦。
- 增加或删除指令非常友善。采用指令模式增加與删除指令不會影響其他類,隻需操作指令子類即可,它滿足“開閉原則”,對擴充比較靈活。
- 可以實作宏指令。指令模式可以與組合模式結合,将多個指令裝配成一個組合指令,即宏指令。
- 通過在請求發送者和請求處理者之間增加轉發類的方式,進而用戶端發出的請求可以在被處理之前都存放在Invoker類的容器中,請求在被執行前就有了一個緩沖,指令模式可以與後面介紹的備忘錄模式結合,能起到以下作用:
a)Invoker能夠對用戶端發出的請求進行排序;
b)Invoker能夠決定是否需要駁回請求;
c)用戶端可以在請求被執行前選擇撤銷某個請求;
d)在需要的情況下,用戶端的請求可以被記錄成日志;
缺點:
可能産生大量具體指令類。因為計對每一個具體操作都需要設計一個具體指令類,這将增加系統的複雜性。
模式結構

- Invoker類用于管理用戶端想要發送的請求Command;
- Invoker中有一個List<Command>,用于存放用戶端發來的還沒有被執行的請求;
- 用戶端通過Invoker類中的add、delete函數,向Invoker發送或删除請求;
- 用戶端通過Invoker類的executeCommand()函數,一次性執行Invoker中尚未被執行的請求。
- 當用戶端執行Invoker的executeCommand()函數時,該函數實際調用了目前Command對象肚子中的executeCommand()函數。
- Command類中含有請求處理者Receiver的對象,用戶端通過Command對象中的setReceiver(Receiver)函數來設定;
- 當用戶端調用Invoker的executeCommand()時,該函數調用了目前Command對象的executeCommand()函數,該函數再調用Command肚子中那個Receiver對象的具體處理函數。
用戶端代碼
main(){
//建立Receiver對象
Receiver receiver = new Receiver();
//建立Command對象,并往Command肚子裡設定該指令所要執行的處理類的對象
Command commandA = new ConcreteCommandA();
commandA.setReceiver(receiver);
Command commandB = new ConcreteCommandB();
commandB.setReceiver(receiver);
//建立Invoker對象,并往它肚子裡添加需要處理的指令
Invoker invoker = new Invoker();
invoker.add(commandA);
invoker.add(commandB);
//執行Invoker肚子裡的所有指令
invoker.executeCommand();
}
參考:
(1)三分鐘了解“指令模式”——設計模式輕松掌握 https://blog.csdn.net/u010425776/article/details/48243053
(2)指令模式(詳解版) http://c.biancheng.net/view/1380.html