責任鏈模式讓多個對象都有機會處理請求,將請求發送者與接收者解耦。它本質上是面向對象的 if-else 鏈重構,將判斷條件分散到各處理器中,構成動態可配的處理鏈路。
nextHandler 引用,定義 handleRequest(Request) 模板方法:滿足條件自處理,否則傳遞給下一個。abstract class Handler {
private Handler next;
public void setNext(Handler h) { next = h; }
public final Response handle(Request req) {
if (canHandle(req)) return doHandle(req);
return next != null ? next.handle(req) : defaultResponse();
}
protected abstract boolean canHandle(Request req);
protected abstract Response doHandle(Request req);
}
class LevelHandler extends Handler {
private int level;
public LevelHandler(int level) { this.level = level; }
protected boolean canHandle(Request req) { return level >= req.getLevel(); }
protected Response doHandle(Request req) { /* 具體業務 */ }
}
// 客戶端構建鏈
Handler h1 = new LevelHandler(1);
Handler h2 = new LevelHandler(3);
Handler h3 = new LevelHandler(5);
h1.setNext(h2); h2.setNext(h3);
h1.handle(new Request(4)); // 由 h2 處理
| 優點 | 缺點 |
|---|---|
| 降低耦合:發送者無需知曉具體處理者 | 性能隱患:長鏈路需逐級判斷,高頻場景需優化 |
| 靈活配置:動態增減/調序處理器 | 調試困難:調用棵分散,難以追蹤流轉路徑 |
| 單一職責:每個處理器專注單一業務 | 循環引用風險:構建鏈時需防止環路 |
責任鏈模式以「鏈式委派」替代「集中判斷」,是處理「多條件、多層級、可擴展」業務流程的標準化方案。設計時務必明確:處理條件正交性、鏈路長度預估、默認處理策略、并發安全性。