首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

責任鏈模式深度解析:靈活處理請求的經典設計

     編輯:Java 相關知識

責任鏈模式是行為型設計模式之一,它將請求的發送者與接收者解耦,讓多個處理者都有機會處理請求,直到某個處理者處理完畢或鏈路末端。本文透過完整程式碼示範核心結構與執行流程。

一、模式結構

  • Handler(抽象處理者):定義處理請求的介面,並持有下一個處理者的引用。
  • ConcreteHandler(具體處理者):實際處理請求,決定是否傳遞給下一個節點。
  • Client(客戶端):組裝鏈路並發起請求。

二、程式碼實作

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

四、應用場景與優缺點

適用場景:

  • 多個物件可處理同一請求,具體由誰處理在執行時動態決定。
  • 需在不明確指定接收者情況下,向多個物件提交請求。
  • 處理者順序需動態調整(如:Servlet Filter、Spring Interceptor、日誌過濾、異常處理鏈)。

優點:降低耦合、符合單一職責原則、靈活新增/移除處理者。

缺點:請求可能未被處理(鏈路末端無節點)、鏈路過長影響效能、除錯較難追蹤流向。

五、實務建議

  1. 提供預設處理者避免請求落空。
  2. 使用建造者或工廠組裝鏈路,避免客戶端硬編碼。
  3. 考慮引入 Request 封裝類,攜帶上下文資訊傳遞給各節點。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved