先來看一個案例:
上述案例在現實生活中更像是一種"推卸責任"的行爲,但在編程世界中,我們也許需要這種"推卸責任"的模式。這就是我們接下來要討論的責任鏈模式(Chain of Responsibility )。
什麼是責任鏈模式?
責任鏈模式中的角色:
- Handler:表示處理器這一類角色,它聲明瞭處理請求的接口(API),並且知道當自己解決不了問題時,應該委託給下一個處理器。
- ConcreteHandler:表示具體的處理器,實現了Handler中聲明的抽象方法。
- Client:請求發起者,即向第一個ConcreteHandler發起請求的角色。
責任鏈模式的類圖:
我們來編寫一個示例程序:
1、創建一個表示問題的類
2、編寫一個表示Handler的類
這是一個抽象類,next屬性是責任鏈中相對一自己的下一個處理器,support方法是對外開放的用於處理問題的方法,在其內部調用了resolve方法,resolve方法的有子類處理器提供具體的實現。
3、編寫表示ConcreteHandler角色的類
這裏提供了4個用於處理特定問題的處理器
4、編寫測試程序
TestDemo實際上充當了Client的角色
結果如上圖所示,在一條責任鏈中,若當前處理器無法處理請求,它會委派給下一個處理器,當最後一個處理器都不能解決問題,則會打印錯誤信息。
最後小結:
1、責任鏈模式弱化了發起請求的人與處理請求的人之間的關係
2、責任鏈模式實際上使得各個處理器的職責更加明確,而非真正的推卸責任
責任鏈上的每一個處理器都只專注於自己能夠解決的問題,對那些自己處理不了的問題,會毫不猶豫(帶感情色彩)地委託給下一個處理器。
3、責任鏈模式一定程度上造成延時
相比於請求人與處理人一一對應的情況來說,請求在責任鏈上傳播,會延遲了請求的處理,當然這需要根據具體情況去權衡,在請求人與處理人關係明確且需要快速處理請求的情況下,不推薦使用責任鏈模式。
Ending ...