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

Java 設計模式:責任鏈模式(Chain of Responsibility)全解析

     編輯:Java 相關知識

什麼是責任鏈模式?

責任鏈模式將請求的發送者與接收者解耦,讓多個處理者都有機會處理請求,將它們連成一條鏈,沿著鏈傳遞請求,直到有處理者處理為止。每個處理者持有對下一個處理者的引用,形成鏈式結構。

演進歷程:從硬編碼到標準模式

方案一:介面包含所有處理方法

interface Handler {
    void handleHelp();
    void handlePrint();
    void handleFormat();
}

缺點:新增請求類型需修改介面及所有實現類,違反開閉原則。

方案二:每種請求一個介面

interface HelpHandler { void handleHelp(); }
interface PrintHandler { void handlePrint(); }
// 實現類需實現多個介面,構造器參數爆炸,代碼醜陋。

方案三:參數化單一方法(關鍵突破)

interface Handler {
    void handleRequest(Request request);
}

class ConcreteHandler implements Handler {
    private Handler successor;
    public ConcreteHandler(Handler s) { this.successor = s; }
    public void handleRequest(Request req) {
        if (canHandle(req)) doHandle(req);
        else if (successor != null) successor.handleRequest(req);
    }
}

引入 Request 封裝請求類型與數據,實現統一分發。

方案四:標準責任鏈(最終形態)

interface Handler {
    void handleRequest(Request request);
}

abstract class AbstractHandler implements Handler {
    private Handler next;
    public void setNext(Handler h) { this.next = h; }
    public void handleRequest(Request req) {
        if (canHandle(req)) doHandle(req);
        else if (next != null) next.handleRequest(req);
    }
    protected abstract boolean canHandle(Request req);
    protected abstract void doHandle(Request req);
}

各具體處理者只關注自己的業務邏輯,鏈的組裝由客戶端或構建器完成。

優缺點

優點缺點
降低耦合:發送者無需知道誰處理性能開銷:請求可能遍歷整條鏈
靈活分發:動態調整鏈的順序/增減處理者調試困難:運行時鏈結構不直觀
單一職責:每類只處理特定請求可能導致請求未被處理(無默認處理者)

實戰應用

  • Java AWT 1.0 事件處理(後被 Observer 取代)。
  • Servlet Filter 鏈、Spring Interceptor 鏈。
  • 審批流程(請假、報銷多級審批)。
  • 異常處理鏈、日誌過濾鏈。

設計建議

適用於「處理者不固定、順序可變、請求類型擴展頻繁」的場景。注意設置「終端處理者」或「默認處理者」防止請求丟失。鏈的組裝可使用建造者模式或配置文件動態構建。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved