天天看點

設計模式之禅之設計模式-責任鍊模式

一:責任鍊模式的定義

        --->使多個對象都有機會處理請求,進而避免了請求的發送者和接受者之間的耦合關系。将這些對象連成一條鍊,并沿着這條鍊傳遞該請求,直到有對象處理它為止。

        --->責任鍊模式的重點是在“鍊”上,由一條鍊去處理相似的請求在鍊中決定誰來處理這個請求,并傳回相應的結果

        --->一般會有一個封裝類對責任模式進行封裝,也就是替代Client類,直接傳回鍊中的第一個處理者,具體鍊的設定不需要高層次子產品關系,這樣,更簡化了高層次子產品的調用,減少子產品間的耦合,提高系統的靈活性。

二:責任鍊模式的應用

         ●責任鍊模式的優點

                責任鍊模式非常顯著的優點是将請求和處理分開。請求者可以不用知道是誰處理的,處理者可以不用知道請求的全貌(例如在J2EE項目開發中,可以剝離出無狀态Bean由責任鍊處理),兩者解耦,提高系統的靈活性。

        ●責任鍊模式的缺點

                責任鍊有兩個非常顯著的缺點:一是性能問題,每個請求都是從鍊頭周遊到鍊尾,特别是在鍊比較長的時候,性能是一個非常大的問題。二是調試不很友善,特别是鍊條比較長,環節比較多的時候,由于采用了類似遞歸的方式,調試的時候邏輯可能比較複雜。

三:責任鍊模式的注意事項

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

       ● 作為請求者可以不用知道到底是需要誰來處理的,這是責任鍊模式的核心,同時責任鍊模式也可以作為一種補救模式來使用

四:責任鍊模式的實戰

          ●在責任鍊模式中一個請求發送到鍊中後,前一節點消費部分消息,然後交由後續節點繼續處理,最終可以有處理結果也可以沒有處理結果,讀者可以不用理會什麼純的、不純的責任鍊模式

        ●這裡也用到模闆方法模式,在模闆方法中判斷請求的級别和目前能夠處理的級别,如果相同則調用基本方法,做出回報;如果不相等,則傳遞到下一個環節,由下一環節做出回應,如果已經達到環節結尾,則直接做不同意處理。

五:責任鍊模式的例子

【1】責任鍊模式的鍊條抽象類

設計模式之禅之設計模式-責任鍊模式
設計模式之禅之設計模式-責任鍊模式

View Code

【2】責任鍊模式的請求包裝

設計模式之禅之設計模式-責任鍊模式
設計模式之禅之設計模式-責任鍊模式

【3】責任鍊模式的響應包裝

設計模式之禅之設計模式-責任鍊模式
設計模式之禅之設計模式-責任鍊模式

【4】第一個責任者

設計模式之禅之設計模式-責任鍊模式
設計模式之禅之設計模式-責任鍊模式

【5】第二個責任者

設計模式之禅之設計模式-責任鍊模式
設計模式之禅之設計模式-責任鍊模式

【6】用戶端

設計模式之禅之設計模式-責任鍊模式
設計模式之禅之設計模式-責任鍊模式

繼續閱讀