責任鏈模式是行為型設計模式之一,它將請求的發送者與接收者解耦,讓多個處理者都有機會處理請求,直到某個處理者處理完畢或鏈路末端。本文透過完整程式碼示範核心結構與執行流程。
package pattern.chainofresponsibility;
public class ChainOfResponsibilityTest {
public static void main(String[] args) {
Handler h1 = new ConcreteHandler1();
Handler h2 = new ConcreteHandler2();
Handler h3 = new ConcreteHandler3();
// 組裝鏈路:h3 -> h2 -> h1
h3.setSuccessor(h2);
h2.setSuccessor(h1);
// 發起請求
h3.handleRequest();
}
}
abstract class Handler {
protected Handler successor;
public Handler getSuccessor() { return successor; }
public void setSuccessor(Handler successor) { this.successor = successor; }
public abstract void handleRequest();
}
class ConcreteHandler1 extends Handler {
@Override
public void handleRequest() {
if (getSuccessor() != null) {
System.out.println("Request passed: from Concrete1 to " + getSuccessor().getClass().getName());
getSuccessor().handleRequest();
} else {
System.out.println("Request handled in ConcreteHandler1");
}
}
}
class ConcreteHandler2 extends Handler {
@Override
public void handleRequest() {
if (getSuccessor() != null) {
System.out.println("Request passed: from Concrete2 to " + getSuccessor().getClass().getName());
getSuccessor().handleRequest();
} else {
System.out.println("Request handled in ConcreteHandler2");
}
}
}
class ConcreteHandler3 extends Handler {
@Override
public void handleRequest() {
if (getSuccessor() != null) {
System.out.println("Request passed: from Concrete3 to " + getSuccessor().getClass().getName());
getSuccessor().handleRequest();
} else {
System.out.println("Request handled in ConcreteHandler3");
}
}
}
Request passed: from Concrete3 to pattern.chainofresponsibility.ConcreteHandler2
Request passed: from Concrete2 to pattern.chainofresponsibility.ConcreteHandler1
Request handled in ConcreteHandler1
適用場景:
優點:降低耦合、符合單一職責原則、靈活新增/移除處理者。
缺點:請求可能未被處理(鏈路末端無節點)、鏈路過長影響效能、除錯較難追蹤流向。
Request 封裝類,攜帶上下文資訊傳遞給各節點。