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

責任鏈模式的定義

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

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

其通用類圖如下:

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

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

Handler 抽象類代碼如下:

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

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

  1. 定義一個請求的處理方法 handleMessage ,唯一對外開放的方法
  2. 定義一個鏈的編排方法 setNext, 設置下一個處理者
  3. 定義具體的處理者必須實現的兩個方法, getHandlerLevel和echo

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

其中涉及到的三個類:

  1. Level: 負責定義請求和處理級別
  2. Request: 負責封裝請求
  3. Response: 負責封裝鏈中返回的結果

場景類代碼如下:

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

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

責任鏈模式的應用

1.責任鏈模式的優點

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

2.責任鏈模式的缺點

  1. 性能問題, 每個請求都是從鏈頭遍歷到鏈尾, 特別在鏈比較長的時候, 性能是一個非常 大的問題
  2. 調試不很方便, 特別是鏈條比較長,環節比較多的時候, 由於採用了類似遞歸的方式, 調試的時候邏輯可能比較複雜

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

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


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


分享到:


相關文章: