設計模式之命令模式學習理解

2022-06-14 21:54:13 字數 3336 閱讀 7306

命令模式(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.在命令管理器中建...