責任鏈模式的定義
Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request. Chain the receiving objects and pass the request along the chain until an object handles it.
避免請求發送者與多個請求處理者耦合在一起,將所有請求的處理者通過前一對象記住其下一個對象的引用而連成一條鏈;當有請求發生時,可將請求沿著這條鏈傳遞,直到有對象處理它為止
責任鏈模式的UML類圖
責任鏈模式的一種實現如下:
<code>public abstract class Handler{
private Handler next;
public void setNextHandler(Handler next){
this.next=next;
}
public Handler getNext(){
return next;
}
// 是否存在下游Handler
public boolean hasNext(){
return nextHandler != null;
}
//處理請求的方法
public abstract void handleRequest(Object request);
}
// ConcreteHandler
public class ConcreteHandler implements Handler{
public void handleRequest(Object request) {
if(match(Object)) {
// TODO: Handle the request
}
if(hasNext()) {
getNext().handleRequest(request);
}
}
}/<code>
責任鏈模式的優點
降低對象間的耦合
避免請求發送者與多個請求處理者耦合在一起,且請求處理對象持有一個指向其後繼處理器的引用,無需感知整個責任鏈結構。
易擴展
如果需要添加新的請求處理類,直接通過實現Handler接口進行擴展。
職責靈活調整
通過動態改變責任鏈內的節點順序和每個處理類的匹配條件,實現責任鏈的靈活處理。
模塊化,職責更趨向單一
責任鏈上的每個請求處理類只需要處理自己的工作,各個處理類間的職責劃分明確。
責任鏈模式的缺點
不能保證每個請求一定被處理
不能保證它一定會被處理,該請求可能一直傳到鏈的末端都得不到處理,如果每個處理類都未處理,考慮默認處理器。
長職責鏈帶來的性能問題
請求處理的對象越多則構造的責任鏈越長,職責在責任鏈中串行處理,如果對象比較多,或處理非常耗時,系統性能將受到一定影響
增加了客戶端處理複雜性
客戶端需要感知責任處理器的存在,並由客戶端基於業務規則建立合理的責任鏈,提高了客戶端邏輯的複雜度。
遵循的OOP原則
開閉原則
通過實現Handler接口進行責任處理類的擴展,無需修改原有代碼。
單一職責原則
每個請求處理類具有內聚性的職責,職責被分派到不同的Handler中
里氏替換原則
責任鏈模式基於抽象接口是實現,面向接口編程
應用場景
- 如果多個對象可以處理同一個請求,但具體由哪個對象處理在運行時刻動態決定。
- 在請求處理者不明確的情況下向多個對象中的一個提交請求
- 需要動態指定處理一個請求的對象集合
閱讀更多 瘋狂架構 的文章