天天看點

行為型模式(2)——指令模式

定義

将一個請求封裝為一個對象,使送出請求的責任和執行請求的責任分割開。這樣兩者之間通過指令對象進行溝通,這樣友善将指令對象進行儲存、傳遞、調用、增加與管理。

假設現在有一個請求處理類(低層類/第三方類),如果用戶端拿到這個類之後直接調用它,那麼用戶端和這個請求處理類之間的藕合度過高。這時候我們在用戶端的請求發送類和請求處理類之間增加一個Invoker類,再将請求發送類發送的所有請求封裝成對象,然後讓Invoker類去管理這些請求對象,并決定這些請求是否允許執行、何時執行、按什麼順序執行。

由于在請求發送類和請求處理類之間增加了請求轉發者,是以這兩個類之間的藕合度就大大降低。

優點:

  1. 降低系統的耦合度。指令模式能将調用操作的對象與實作該操作的對象解耦。
  2. 增加或删除指令非常友善。采用指令模式增加與删除指令不會影響其他類,隻需操作指令子類即可,它滿足“開閉原則”,對擴充比較靈活。
  3. 可以實作宏指令。指令模式可以與組合模式結合,将多個指令裝配成一個組合指令,即宏指令。
  4. 通過在請求發送者和請求處理者之間增加轉發類的方式,進而用戶端發出的請求可以在被處理之前都存放在Invoker類的容器中,請求在被執行前就有了一個緩沖,指令模式可以與後面介紹的備忘錄模式結合,能起到以下作用:

            a)Invoker能夠對用戶端發出的請求進行排序;

            b)Invoker能夠決定是否需要駁回請求;

            c)用戶端可以在請求被執行前選擇撤銷某個請求;

            d)在需要的情況下,用戶端的請求可以被記錄成日志;

缺點:

可能産生大量具體指令類。因為計對每一個具體操作都需要設計一個具體指令類,這将增加系統的複雜性。

模式結構

行為型模式(2)——指令模式
  • 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

繼續閱讀