20 chain of responsibility(行爲型)
-
- 對於一個請求,能自己做就自己做,做不了就推卸給下一個人;下
一個人能自己做就自己做,不能做再推卸給下一個人。
-
- 直接決定由哪個對象負責處理時,就需要推卸責任。我們可以將多
個對象組成一個職責鏈,然後按照它們在職責鏈上的順序一個一個
地找出誰來負責處理。
-
- 缺點:延遲
- 優點:將請求的發送方與其接收方解耦。
- 動機:
- 通過給多個對象處理請求的機會,避免將請求的發送方與其接收方耦合。
- 將接收對象鏈起來,並沿着鏈傳遞請求,直到對象處理它。
- 什麼時候用:
- 一個以上的對象可以處理一個請求,並且這個處理程序是未知的。應該自動確定處理程序。
- 您希望向幾個對象中的一個發出請求,而不需要顯式地指定接收方。
- 可以處理請求的對象集應該動態指定。
- 結構:
- 一個典型的對象結構可能是這樣的:
- 參與者:
- 處理器
- 定義了一個處理請求的接口。
- (可選)實現繼承鏈接。
- ConcreteHandler
- 處理它負責的請求。
- 可以訪問它的繼承者successor。
- 如果混凝土處理程序可以處理請求,它就會這樣做;否則,它將請求轉發給其繼任者。
- 客戶機
- 向鏈上的一個concrete處理器對象發起請求。
- 處理器
- 協作:
- 當客戶端發出請求,請求propagates(傳播)沿着鏈之前
concrete處理程序對象負責處理它。
-
- 結果:(好處)
- 減少耦合
- 客戶機不知道哪個對象處理請求。
- 客戶端只需要知道一個請求將被處理
- 接收方和發送方對彼此都沒有明確的認識。
- 鏈中的處理器不需要知道鏈的結構。
- 減少耦合
- 結果:(好處)
-
- 爲對象分配職責時增加靈活性。
- 您可以將它與子類化結合起來靜態地專門化處理程序。
- 您可以通過在運行時添加或以其他方式更改鏈來添加或更改處理請求的職責。
- 爲對象分配職責時增加靈活性。
-
- 結果:(壞處)
- 接收處理不被保證。
- 因爲一個請求沒有明確的接收者,所以不能保證它會被處理。
- 請求可以從鏈的末端掉下來而不被處理。
- 當鏈沒有正確配置時,請求也可以不被處理。
- 接收處理不被保證。
- 例:
- 結果:(壞處)