命令模式(command pattern)是一種資料驅動的設計模式,它屬於行為型模式。請求以命令的形式包裹在物件中,並傳給呼叫物件。呼叫物件尋找可以處理該命令的合適的物件,並把該命令傳給相應的物件,該物件執行命令。
意圖:將乙個請求封裝成乙個物件,從而使您可以用不同的請求對客戶進行引數化。
主要解決:在軟體系統中,行為請求者與行為實現者通常是一種緊耦合的關係,但某些場合,比如需要對行為進行記錄、撤銷或重做、事務等處理時,這種無法抵禦變化的緊耦合的設計就不太合適。
何時使用:在某些場合,比如要對行為進行"記錄、撤銷/重做、事務"等處理,這種無法抵禦變化的緊耦合是不合適的。在這種情況下,如何將"行為請求者"與"行為實現者"解耦?將一組行為抽象為物件,可以實現二者之間的松耦合。
如何解決:通過呼叫者呼叫接受者執行命令,順序:呼叫者→接受者→命令。
關鍵**:定義三個角色:1、received 真正的命令執行物件 2、command 3、invoker 使用命令物件的入口
應用例項:struts 1 中的 action 核心控制器 actionservlet 只有乙個,相當於 invoker,而模型層的類會隨著不同的應用有不同的模型類,相當於具體的 command。
優點:1、降低了系統耦合度。 2、新的命令可以很容易新增到系統中去。
缺點:使用命令模式可能會導致某些系統有過多的具體命令類。
使用場景:認為是命令的地方都可以使用命令模式,比如: 1、gui 中每乙個按鈕都是一條命令。 2、模擬 cmd。
注意事項:系統需要支援命令的撤銷(undo)操作和恢復(redo)操作,也可以考慮使用命令模式,見命令模式的擴充套件。
假設現在有個建立工單的類,還有個安裝工的類負責接收和安裝工單。
簡單的緊耦合實現
1/**2
* 新建工單類3*
@authorko4
*5*/6
public
class
newlybuildorder
1112
public
void
buildtypeborder()
1516 }
1/**2
* 安裝工
3* 接單並安裝4*
@authorko5
*6*/7
public
class
installer
1718 }
1/**2
* 測試類
3* 新建工單
4* 安裝工領取並安裝工單5*
@authorko6
*7*/8
public
class
test
15 }
build type a order...build type b order...
build type a order...
build type a order...
這其實是行為請求者和行為實現者的緊耦合,這樣寫有很多弊端,如果安裝工多了,那就會很混亂,沒有日誌記錄,另外需要撤銷領取的工單重新領取也不行。
松耦合命令模式實現
1//把行為請求者對行為實現者的命令抽象成類
2public
abstract
class
command 910
//執行命令
11public
abstract
void
excutecommand();
1213 }
1//a類工單命令
2public
class typeaordercommand extends
command 89
@override
10public
void
excutecommand()
1314
@override
15public
string tostring()
1819 }
1//b類工單命令
2public
class typebordercommand extends
command 89
@override
10public
void
excutecommand()
1314
@override
15public
string tostring()
1819 }
1/**2
* 工單管理
3* 介於行為請求者和行為實現者之間的類4*
@authorko5
*6*/7
public
class
ordermanage else22}
2324
//撤銷訂單
25public
void
revokeorder(command command)
3031
public
void
notifybuilder()35}
3637 }
1/**2
* 新建工單類3*
@authorko4
*5*/6
public
class
newlybuildorder
1112
public
void
buildtypeborder()
1516 }
1/**2
* 測試類3*
@authorko4
*5*/6
public
class
test
23 }
type a order is over, can't provide ...log add order:typebordercommand,time:1500879972241
build type b order...
理解設計模式之命令模式
將 請求 封裝成物件,以便使用不同的請求,佇列或者日誌來引數化其他物件。命令模式用於方法呼叫類和方法實現類之間的解耦。在呼叫某個方法的時候不直接通過實現類呼叫,而是通過呼叫具體命令類的方法,在具體命令類的方法裡面呼叫實現類的方法。其實就是通過加入第三者 命令類 來實現呼叫者和執行者之間的解耦。命令模...
設計模式之命令設計模式
先來看一下命令模式的類圖 乍一看好像類很多,其實我們逐個分析他們。類圖中存在的類可以分為 invoker icommand conceretecommand receiver invoker類 上層直接調取invoker類 icommand 是對命令的抽象 conceretecommand 是命令的...
設計模式之命令模式
command pattern 將請求封裝成物件,這可以讓你使用不同的請求,佇列,或者是日誌請求來引數化其他物件,命令模式也可以支援撤銷操作。命令模式有兩種實現方式 1.在命令管理器中提供設定當前命令接受者的方法,當執行訊息或者是有訊息壓入的時候直接將命令傳送給當前設定的接受者。2.在命令管理器中建...