行為型模式 命令模式

2021-09-24 08:02:08 字數 3318 閱讀 9941

liebrother原文: 行為型模式:命令模式

十一大行為型模式之三:命令模式。

姓名:命令模式

英文名:command pattern

價值觀:軍令如山

個人介紹

encapsulate a request as an object,thereby letting you parameterize clients with different requests,queue or log requests,and support undoable operations. 將乙個請求封裝成乙個物件,從而讓你使用不同的請求把客戶端引數化,對請求排隊或者記錄請求日誌,可以提供命令的撤銷和恢復功能。 (來自《設計模式之禪》)

作為乙個程式猿,我們每天都在經歷著命令模式,技術經理把需求任務分配給工程師開發,有時因為第三方或者其他不可抗拒的因素導致需求停止開發。這種工作模式就是命令模式。好了,開始故事了。小明在 xx 科技公司做乙個安靜的程式猿,有一天技術經理給他分配了乙個任務:新增黑名單,也就是在他們系統的某個模組裡面可以手工對**打黑名單標籤的功能。小明接到任務後就立馬開發,在開發了 2 天之後,因為戰略原因,技術經理大明暫停了這個開發任務,接下來我們通過非命令模式和命令模式 2 種**實現來體現這個過程。在這個場景中,為了簡單,我們假定技術經理大明手下只有小明乙個開發人員。

非命令模式也就是不使用命令模式的**實現。**中,我們出現了 developer 開發人,開發同學是接受技術經理傳達的任務,技術經理讓他開發哪個需求就開發哪個需求,如果專案有問題需要中斷,也需要技術經理評估後傳達給開發同學,所以 developer 有 2 個方法,分別是 develop() 開發需求和 suspend() 暫停需求。 requirement 則為需求類,technicalmanager1 則為技術經理類,他有乙個方法 action(),通過這個方法來指定開發同學開發任務或者暫停任務。

public

class

nocommandtest

}/**

* 開發人員

*/class

developer

public

void

develop

(requirement requirement)

public

void

suspend

(requirement requirement)

public string getname()}

/** * 需求

*/class

requirement

public string getname()}

/** * 技術經理

*/class

technicalmanager1

public

void

setdeveloper

(developer developer)

public

void

action

(requirement requirement, string type)

else

if ("suspend".equals(type))

}}列印結果:

小明 開始開發需求:新增黑名單

開發了 2 天,需求變故,需要暫停。。。

小明 停止開發需求:新增黑名單

複製**

通過**,我們可以發現技術經理和開發同學是強依賴關係。如果技術經理下達了乙個任務,要求小明寫一下週報,這時候得怎麼寫?是不是小明需要乙個寫週報的方法,大明也需要新增乙個處理事務型別?有沒有更好的方法讓技術經理不需要做任何改變?命令模式就來解決這個問題。

在這個例子中,不管大明叫小明做什麼事情,其實都是一樣的,就是下達任務命令,讓小明去執行命令。我們可以利用命令模式把下達任務這個抽象起來,當做父類,下達開發命令、下達暫停命令、下達寫週報等等都是不同的子命令。**如下。

public

class

commandtest

}/**

* 命令

*/abstract

class

command

public

abstract

void

execute

(requirement requirement);}

/** * 開始開發

*/class

developcommand

extends

command

@override

public

void

execute

(requirement requirement)

}/**

* 開發中斷

*/class

suspendcommand

extends

command

@override

public

void

execute

(requirement requirement)

}/**

* 技術經理

*/class

technicalmanager2

public

void

action

(requirement requirement)

public

void

setcommand

(command command)

}列印結果:

小明 開始開發需求:新增黑名單

開發了 2 天,需求變故,需要暫停。。。

小明 停止開發需求:新增黑名單

複製**

**中用 command 來抽象下達任務,而技術經理 technicalmanager2 並沒有和 developer 有直接的關係,而是 technicalmanager2 和 command 建立的聯絡,command 和 developer 建立了聯絡。這樣子把大明和小明的強依賴關係給剝離開,而新增乙個下達寫週報的任務也很簡單,在 developer 中新增乙個處理寫週報的方法,新增乙個寫週報的 command 子類,就可以了,technicalmanager2 如上面所願不用修改。這就是完整的乙個命令模式**。

**: command pattern

從文章中我們就可以看到,利用命令模式能夠進行類的解耦,讓呼叫者和接受者沒有任何關係,也通過對行為的抽象,讓新增其他行為變得清晰容易,也就是可擴充套件性大大增加

行為型模式 命令模式

liebrother原文 行為型模式 命令模式 十一大行為型模式之三 命令模式。姓名 命令模式 英文名 command pattern 價值觀 軍令如山 個人介紹 encapsulate a request as an object,thereby letting you parameterize ...

命令模式 物件行為型模式

一 意圖 將乙個請求封裝為乙個物件,從而使你可用不同的請求對客戶進行引數化 對請求排隊或記錄請求日誌,以及支援可撤銷操作。二 適用性 當有以下需求時,可使用command模式 三 結構 四 public class receiver public inte ce command public cla...

行為型模式 命令模式(C )

命令模式特點 命令模式例項 將乙個請求封裝為乙個物件,使發出請求的責任與執行請求的責任分割開,也就是說,將命令的請求者和命令執行者兩者之間實現 松耦合 方便對行為進行 記錄 撤銷 等操作 結構與實現 模式的結構 命令模式的uml類圖 命令模式特點優點 缺點 命令模式例項 include includ...