責任鏈模式是行為型設計模式之一,它將請求的發送者與接收者解耦,讓多個處理物件都有機會處理該請求。本文將透過實際程式碼範例,深入剖析責任鏈模式在 Java 中的實作細節與應用場景。
避免請求發送者與接收者耦合在一起,讓多個物件都有可能接收請求,將這些物件連成一條鏈,並沿著這條鏈傳遞請求,直到有物件處理它為止。
public abstract class Handler {
protected Handler successor;
public void setSuccessor(Handler successor) {
this.successor = successor;
}
public abstract void handleRequest(Request request);
}
public class ConcreteHandlerA extends Handler {
@Override
public void handleRequest(Request request) {
if (request.getType() == RequestType.TYPE_A) {
System.out.println("HandlerA 處理請求: " + request.getContent());
} else if (successor != null) {
successor.handleRequest(request);
}
}
}
public class ConcreteHandlerB extends Handler {
@Override
public void handleRequest(Request request) {
if (request.getType() == RequestType.TYPE_B) {
System.out.println("HandlerB 處理請求: " + request.getContent());
} else if (successor != null) {
successor.handleRequest(request);
}
}
}
public class Request {
private RequestType type;
private String content;
public Request(RequestType type, String content) {
this.type = type;
this.content = content;
}
// getter/setter 省略
}
public enum RequestType {
TYPE_A, TYPE_B, TYPE_C
}
public class Client {
public static void main(String[] args) {
Handler handlerA = new ConcreteHandlerA();
Handler handlerB = new ConcreteHandlerB();
Handler handlerC = new ConcreteHandlerC();
handlerA.setSuccessor(handlerB);
handlerB.setSuccessor(handlerC);
handlerA.handleRequest(new Request(RequestType.TYPE_A, "請求 A"));
handlerA.handleRequest(new Request(RequestType.TYPE_B, "請求 B"));
handlerA.handleRequest(new Request(RequestType.TYPE_C, "請求 C"));
}
}
Java Web 中的 Filter 鏈即為責任鏈模式的經典應用,每個 Filter 可選擇處理請求或傳遞給下一個 Filter。
多層 try-catch 結構可視為責任鏈,異常沿著呼叫堆疊向上傳播,直到被捕獲處理。
請假單、報銷單等多級審批,每級審核者為一個處理節點,符合條件則通過,否則駁回或轉交上級。
| 優點 | 缺點 |
|---|---|
| 降低耦合度,發送者無需知道具體處理者 | 請求可能不被處理(鏈尾無處理者) |
| 簡化物件相互連接,僅需維持單向引用 | 效能開銷:請求需遍歷鏈路 |
| 靈活指派職責,動態調整鏈路順序 | 除錯困難:執行路徑非直觀 |
責任鏈模式透過將處理邏輯分散到獨立的處理者物件中,實現了請求處理的靈活組合與動態擴展。在 Java 開發中,無論是框架層面的 Filter/Interceptor,還是業務層面的審批流程、異常處理,都能見到其身影。掌握此模式有助於設計高內聚、低耦合的系統架構。