5

爲什麼我需要使用責任鏈,如果我可以將所有命令加載到某個容器中並且只是逐個執行命令。這將連續處理一個請求。順便說一句,我覺得它比CoR好,因爲你可以在運行時刪除一些特定的命令或用另一個命令代替,而對於CoR,你需要創建另一個鏈來改變鏈中的某些東西,因爲你無法訪問除第一個元素外的鏈。 (這是,實際上,單鏈表。)責任鏈與隊列或堆棧中的命令

回答

1

只是爲了「保持簡單愚蠢」 :-)

創建隊列/堆棧當你特別需要它,你就會知道,當你需要它,不是嗎?

對於示例 - 如果你不得不做一些簡單的數據操作,如:

data.clean().format().save(); 

VS

commands.push(new Cleaner(data)); 
commands.push(new Formatter(data)); 
commands.push(new Updates(data)); 
commands.execute(); 

也注意到,我不得不寫更多的代碼來創建新的數據結構(堆棧命令)。

但讓我們說這是更具戰略意義的東西,比如射擊遊戲。玩家可以被射殺,等等,結果取決於選擇的遊戲難度級別。

headShot = new Command(); 
headShot.push(new FreezePlayer()); 
headShot.push(new BleedPlayer()); 
headShot.push(new KillPlayer()); 

bodyShot = new Command(); 
headShot.push(new FreezePlayer()); 
headShot.push(new BleedPlayer()); 
headShot.push(new LooseHealth()); 

player.onHit = function(hitPoint){ 
    hitPoint.aboveNeck() ? headShot.on(this) : bodyShot.on(this); 
}; 

注意在這種情況下,我們必須創建一個可以在運行時傳遞併發生的策略。

因此,在簡單模式下,bodyShot可能沒有最後一個元素(LooseHealth),並且headShot可能有LooseHealth而不是KillPlayer作爲最後一個元素。

希望它有幫助。

+0

哪一個很簡單? COR還是堆棧?對我來說,兩者都是一樣的sh * t。 – Narek

+0

好吧,看看上面編輯的答案 – Nishant

+0

你已經比較了堆棧和靜態'data.clean().format()。save();'。但是我正在詢問stack vs COR,因爲可以在兩者中完成運行時更改,因爲在COR中可以創建新鏈。 – Narek

0

我不認爲CoR需要單鏈表。這可能是一個常見的實現;但可以使用雙向鏈表或幾乎任何其他集合/容器,只要它將消息發送者與消息接收者分開即可。你所描述的聲音完全符合CoR模式。您只是增強了配置鏈的能力。值得注意的是,GoF definition教導我們要實現連鎖,

沒有硬接線處理關係和優先級,

是很重要的......但我不認爲應該限制我們的選擇處理程序的集合。


另請注意,責任鏈與處理鏈不同。後者意味着連續的操作(即一個pipeline),而前者是分層次的,但不一定是連續的。任何數量和組合的處理程序(或它們中的任何一個)都可以作用於單個請求。

最後,我假設在問題中使用單詞「commands」是對鏈中處理程序的引用,而不是對Command Pattern的引用。 CoR和Command模式可以根據對Chain的請求進行互補,但傳統上不是以Commands作爲處理程序。