責任鏈模式是一種行為型設計模式,它將多個處理對象串聯成一條鏈,請求沿著鏈路傳遞,直到某個對象決定處理該請求為止。發起請求的客戶端無需知道具體由哪個對象處理,從而實現請求發送者與接收者的解耦,系統可靈活地動態調整處理邏輯與職責分派。
購房流程即是典型例子:客戶向銷售提出折扣需求,銷售有權處理則直接回應;權限不足則上報銷售總監;若金額極大,總監再轉請 CEO 批准。客戶始終只與銷售對接,不知最終由誰拍板,這正是責任鏈解耦的核心價值。
package com.pattern.chain;
public abstract class Leader {
protected Leader nextHandler; // 上級領導引用
public final void handleRequest(int money) {
if (money <= limit()) {
handle(money); // 權限內直接處理
} else if (nextHandler != null) {
nextHandler.handleRequest(money); // 轉交上級
}
}
/** 審批額度上限 */
public abstract int limit();
/** 具體審批邏輯 */
public abstract void handle(int money);
}
// 組長:1000 元額度
public class GroupLeader extends Leader {
@Override public int limit() { return 1000; }
@Override public void handle(int money) {
System.out.println("組長批准報銷:" + money + " 元");
}
}
// 主管:5000 元額度
public class Director extends Leader {
@Override public int limit() { return 5000; }
@Override public void handle(int money) {
System.out.println("主管批准報銷:" + money + " 元");
}
}
// 經理:10000 元額度
public class Manager extends Leader {
@Override public int limit() { return 10000; }
@Override public void handle(int money) {
System.out.println("經理批准報銷:" + money + " 元");
}
}
// CEO:無上限
public class CEO extends Leader {
@Override public int limit() { return Integer.MAX_VALUE; }
@Override public void handle(int money) {
System.out.println("CEO 批准報銷:" + money + " 元");
}
}
public class ExpenseClient {
public static void main(String[] args) {
// 建立責任鏈:組長 → 主管 → 經理 → CEO
Leader groupLeader = new GroupLeader();
Leader director = new Director();
Leader manager = new Manager();
Leader ceo = new CEO();
groupLeader.nextHandler = director;
director.nextHandler = manager;
manager.nextHandler = ceo;
// 測試不同金額
groupLeader.handleRequest(500); // 組長處理
groupLeader.handleRequest(5000); // 主管處理
groupLeader.handleRequest(50000); // CEO 處理
}
}
| 優點 | 缺點 |
|---|---|
| 降低耦合度,發送者無需知曉接收者細節 | 請求可能不被處理(鏈尾無人負責) |
| 簡化對象關係,每個節點只關注自身職責 | 鏈路過長影響性能,且難以調試 |
| 動態調整鏈路結構,靈活分配職責 | 循環引用風險導致死循環 |
責任鏈模式通過「推卸責任」的優雅方式,實現了職責的動態分流與解耦,是構建靈活可擴展系統的重要利器。