淺析設計模式:責任鏈模式(Chain of Responsibility)

  先來看一個案例:


     上述案例在現實生活中更像是一種"推卸責任"的行爲,但在編程世界中,我們也許需要這種"推卸責任"的模式。這就是我們接下來要討論的責任鏈模式(Chain of Responsibility )。

什麼是責任鏈模式?

將用於解決問題的對象(Handler)組成一條職責鏈,對於每一個對象,當自己能夠解決問題時就必須解決,否則將問題傳遞給職責鏈中的下一個對象,即按照對象在職責鏈中的順序,一個個的找出第一個能解決問題的對象,這種模式就是責任鏈模式。


責任鏈模式中的角色:

  • Handler:表示處理器這一類角色,它聲明瞭處理請求的接口(API),並且知道當自己解決不了問題時,應該委託給下一個處理器。
  • ConcreteHandler:表示具體的處理器,實現了Handler中聲明的抽象方法。
  • Client:請求發起者,即向第一個ConcreteHandler發起請求的角色。


責任鏈模式的類圖:

我們來編寫一個示例程序:

1、創建一個表示問題的類


2、編寫一個表示Handler的類

    這是一個抽象類,next屬性是責任鏈中相對一自己的下一個處理器,support方法是對外開放的用於處理問題的方法,在其內部調用了resolve方法,resolve方法的有子類處理器提供具體的實現。


3、編寫表示ConcreteHandler角色的類

這裏提供了4個用於處理特定問題的處理器


4、編寫測試程序

TestDemo實際上充當了Client的角色


    結果如上圖所示,在一條責任鏈中,若當前處理器無法處理請求,它會委派給下一個處理器,當最後一個處理器都不能解決問題,則會打印錯誤信息。

最後小結:

1、責任鏈模式弱化了發起請求的人與處理請求的人之間的關係

Client發起請求,該請求會沿着職責鏈傳播,直到找到第一個能夠處理該請求的ConcreteHandler,這樣Client不需要知道具體是哪個ConcreteHnadler能夠處理請求,而ConcreteHandler也不需要知道是誰發起了請求。否則,發起請求的人就必須知道誰能夠處理請求,二者就形成了一種關聯關係。

2、責任鏈模式實際上使得各個處理器的職責更加明確,而非真正的推卸責任

    責任鏈上的每一個處理器都只專注於自己能夠解決的問題,對那些自己處理不了的問題,會毫不猶豫(帶感情色彩大笑)地委託給下一個處理器。

3、責任鏈模式一定程度上造成延時

    相比於請求人與處理人一一對應的情況來說,請求在責任鏈上傳播,會延遲了請求的處理,當然這需要根據具體情況去權衡,在請求人與處理人關係明確且需要快速處理請求的情況下,不推薦使用責任鏈模式。


Ending ...奮鬥

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章