責任鏈模式的定義 定義: 使多個對象都有機會處理請求, 從而避免了請求的發送者和接受者之間的耦合關係. 將這些對象連成一條鏈, 並沿著這條鏈傳遞該請求,直到有對象處理它為止 通俗的講, 就是將對請求的處理組成一條鏈, 當請求來時, 在鏈中依次傳遞, 知道找到能夠處理此請求的對象 其通用類圖如下: 責 ...
責任鏈模式的定義
定義: 使多個對象都有機會處理請求, 從而避免了請求的發送者和接受者之間的耦合關係. 將這些對象連成一條鏈, 並沿著這條鏈傳遞該請求,直到有對象處理它為止
通俗的講, 就是將對請求的處理組成一條鏈, 當請求來時, 在鏈中依次傳遞, 知道找到能夠處理此請求的對象
其通用類圖如下:
責任鏈模式的重點是 在"鏈"上, "鏈"由多個處理者 ConcreteHandler 組成的
Handler 抽象類代碼如下:
抽象的處理者實現三個職責:
- 定義一個請求的處理方法 handleMessage ,唯一對外開放的方法
- 定義一個鏈的編排方法 setNext, 設置下一個處理者
- 定義具體的處理者必須實現的兩個方法, getHandlerLevel和echo
具體處理類實現抽象類的方法即可
其中涉及到的三個類:
- Level: 負責定義請求和處理級別
- Request: 負責封裝請求
- Response: 負責封裝鏈中返回的結果
場景類代碼如下:
在實際應用中, 一般會有一個封裝類對責任鏈進行封裝, 直接返回鏈中的第一個處理者, 具體鏈的設置不需要高層模塊關心, 這樣, 更簡化了高層模塊的調用, 減少模塊間的耦合, 提高系統的靈活性
責任鏈模式的應用
1.責任鏈模式的優點
責任鏈模式非常顯著的優點就是將請求和處理分開.請求者可以不用知道是誰處理的, 處理者可以不用知道請求的全貌, 兩者解耦, 提高系統的靈活性
2.責任鏈模式的缺點
- 性能問題, 每個請求都是從鏈頭遍歷到鏈尾, 特別在鏈比較長的時候, 性能是一個非常 大的問題
- 調試不很方便, 特別是鏈條比較長,環節比較多的時候, 由於採用了類似遞歸的方式, 調試的時候邏輯可能比較複雜
3.責任鏈模式的註意事項
鏈中節點數量需要控制,避免出現超長鏈的情況, 一般的做法是在Handler中設置一個最大節點數量, 在setNext方法中判斷是否已經超出其閾值, 超過則不允許該鏈建立, 避免無意識的破壞系統性能
在上面的例子中, 融合了模板方法模式, 通過融合模板方法模式, 各個實現類只要關註自己的業務邏輯就成了, 至於什麼事要自己處理, 就讓父類去決定好了, 也就是說父類實現了請求傳遞的功能, 子類實現請求的處理, 符合單一職責原則, 這樣, 子類的實現非常簡單, 責任鏈的建立也非常靈活.