爲什麼我需要使用責任鏈,如果我可以將所有命令加載到某個容器中並且只是逐個執行命令。這將連續處理一個請求。順便說一句,我覺得它比CoR好,因爲你可以在運行時刪除一些特定的命令或用另一個命令代替,而對於CoR,你需要創建另一個鏈來改變鏈中的某些東西,因爲你無法訪問除第一個元素外的鏈。 (這是,實際上,單鏈表。)責任鏈與隊列或堆棧中的命令
5
A
回答
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需要單鏈表。這可能是一個常見的實現;但可以使用雙向鏈表或幾乎任何其他集合/容器,只要它將消息發送者與消息接收者分開即可。你所描述的聲音完全符合CoR模式。您只是增強了配置鏈的能力。值得注意的是,GoF definition教導我們要實現連鎖,
沒有硬接線處理關係和優先級,
是很重要的......但我不認爲應該限制我們的選擇處理程序的集合。
另請注意,責任鏈與處理鏈不同。後者意味着連續的操作(即一個pipeline),而前者是分層次的,但不一定是連續的。任何數量和組合的處理程序(或它們中的任何一個)都可以作用於單個請求。
最後,我假設在問題中使用單詞「commands」是對鏈中處理程序的引用,而不是對Command Pattern的引用。 CoR和Command模式可以根據對Chain的請求進行互補,但傳統上不是以Commands作爲處理程序。
相關問題
- 1. 在C++中鏈接雙棧鏈表和堆棧和隊列類
- 2. 命令模式以及責任鏈
- 3. 隊列+堆棧C++
- 4. 報警歷史堆棧或隊列?
- 5. Android的隊列VS堆棧
- 6. Java堆棧與隊列性能
- 7. 將列表中的項目移動到堆棧或隊列中
- 8. 使用隊列堆棧
- 9. 堆棧和隊列用java
- 10. 在堆棧和隊列
- 11. cuda中的遞歸/堆棧和隊列
- 12. 與線程池鏈責任
- 13. C#與代表責任鏈
- 14. 你會用什麼來實現兩個堆棧隊列?基於數組的棧或鏈表棧?怎麼樣兩個隊列堆棧?
- 15. 堆棧/隊列中鏈接列表/雙向鏈表的複雜性?
- 16. 從隊列中將值壓入堆棧
- 17. Symfony命令的責任是什麼?
- 18. 使用堆棧或隊列的最大排列
- 19. 列表,數組,堆棧隊列?
- 20. 棧,隊列和鏈表
- 21. 堆棧vs排隊?
- 22. 「調用堆棧」和「任務隊列」之間的區別
- 23. 使用兩個堆棧的隊列
- 24. 比較隊列和堆棧的內容
- 25. 堆棧和隊列的使用情況?
- 26. 爲什麼在jdk中沒有隊列或堆棧API
- 27. 堆棧或堆
- 28. 使用__cdecl和誰的責任是清理堆棧
- 29. GNUPlot - 堆棧行中的任意列數
- 30. 誰負責確定堆棧的大小
哪一個很簡單? COR還是堆棧?對我來說,兩者都是一樣的sh * t。 – Narek
好吧,看看上面編輯的答案 – Nishant
你已經比較了堆棧和靜態'data.clean().format()。save();'。但是我正在詢問stack vs COR,因爲可以在兩者中完成運行時更改,因爲在COR中可以創建新鏈。 – Narek