23種設計模式之責任鏈模式

2022-05-10 23:40:03 字數 1128 閱讀 9362

定義: 使多個物件都有機會處理請求, 從而避免了請求的傳送者和接受者之間的耦合關係. 將這些物件連成一條鏈, 並沿著這條鏈傳遞該請求,直到有物件處理它為止

通俗的講, 就是將對請求的處理組成一條鏈, 當請求來時, 在鏈中依次傳遞, 知道找到能夠處理此請求的物件

其通用類圖如下:

責任鏈模式的重點是 在"鏈"上, "鏈"由多個處理者 concretehandler 組成的

handler 抽象類**如下:

抽象的處理者實現三個職責:

定義乙個請求的處理方法 handlemessage ,唯一對外開放的方法

定義乙個鏈的編排方法 setnext, 設定下乙個處理者

定義具體的處理者必須實現的兩個方法, gethandlerlevel和echo

具體處理類實現抽象類的方法即可

其中涉及到的三個類:

level: 負責定義請求和處理級別

request: 負責封裝請求

response: 負責封裝鏈中返回的結果

場景類**如下:

在實際應用中, 一般會有乙個封裝類對責任鏈進行封裝, 直接返回鏈中的第乙個處理者, 具體鏈的設定不需要高層模組關心, 這樣, 更簡化了高層模組的呼叫, 減少模組間的耦合, 提高系統的靈活性

1.責任鏈模式的優點

責任鏈模式非常顯著的優點就是將請求和處理分開.請求者可以不用知道是誰處理的, 處理者可以不用知道請求的全貌, 兩者解耦, 提高系統的靈活性

2.責任鏈模式的缺點

效能問題, 每個請求都是從鏈頭遍歷到鏈尾, 特別在鏈比較長的時候, 效能是乙個非常 大的問題

除錯不很方便, 特別是鏈條比較長,環節比較多的時候, 由於採用了類似遞迴的方式, 除錯的時候邏輯可能比較複雜

3.責任鏈模式的注意事項

鏈中節點數量需要控制,避免出現超長鏈的情況, 一般的做法是在handler中設定乙個最大節點數量, 在setnext方法中判斷是否已經超出其閾值, 超過則不允許該鏈建立, 避免無意識的破壞系統效能

在上面的例子中, 融合了模板方法模式, 通過融合模板方法模式, 各個實現類只要關注自己的業務邏輯就成了, 至於什麼事要自己處理, 就讓父類去決定好了, 也就是說父類實現了請求傳遞的功能, 子類實現請求的處理, 符合單一職責原則, 這樣, 子類的實現非常簡單, 責任鏈的建立也非常靈活.

23種設計模式之責任鏈模式

責任鏈模式 chain of responsibility pattern 為請求建立了乙個接收者物件的鏈。這種模式給予請求的型別,對請求的傳送者和接收者進行解耦。這種型別的設計模式屬於行為型模式。在這種模式中,通常每個接收者都包含對另乙個接收者的引用。如果乙個物件不能處理該請求,那麼它會把相同的請...

23種設計模式 13 責任鏈模式

使多個物件都有機會處理請求,從而避免請求的傳送者和接受者質檢的耦合關係。將這個接收物件連成一條鏈,並沿著這條鏈傳遞請求,直到有乙個物件處理他為止。先來看乙個反面例子 使用大量的if判斷來選擇執行邏輯 public response handlerequest request request else...

java23種設計模式 責任鏈模式

屬於行為型模式的一種,乙個請求由多個物件來處理,這些物件形成一條鏈,請求沿著該鏈傳遞,直到該鏈上的某個物件處理它為止。desc 抽象處理者 created by tiantian on 2018 8 19 public inte ce ihandler package design.patten.c...