一、定義:
? ? ? ? 使多個對象都有機會處理請求,從而避免了請求的發送者和接收者之間的耦合關系將這些對象連城一條鏈,并沿著這條鏈傳遞該請求,只到有對象處理它為止。
二、模式結構:
? ? ? ? 抽象處理者(Handler):定義處理請求的接口,包含處理方法和設置下一個處理者的引用。
? ? ? ? 具體處理者(ConcreteHandler):實現抽象接口,決定是否處理請求或傳遞給鏈的下一個對象。
三、應用場景:
? ? ? ? 1.事件處理:view的層級事件分發。
? ? ? ? 2.網絡攔截鏈:OkHttp請求的攔截器機制。
? ? ? ? 3.權限校驗:多級權限檢查。
四、代碼例子:
? ? ? ? 1.定義抽象處理者
public abstract class LoggerHandler {
? ? protected LoggerHandler nextHandler;
? ? // 設置下一個處理器
? ? public void setNextHandler(LoggerHandler nextHandler) {
? ? ? ? this.nextHandler = nextHandler;
? ? }
? ? // 處理日志請求
? ? public abstract void handleLog(String message, int level);
}
? ? ? ? 2.實現具體處理者
// INFO 級別日志處理器
public class InfoLogger extends LoggerHandler {
? ? @Override
? ? public void handleLog(String message, int level) {
? ? ? ? if (level <= LogLevel.INFO) {
? ? ? ? ? ? System.out.println("INFO: " + message); // 模擬處理邏輯
? ? ? ? } else if (nextHandler != null) {
? ? ? ? ? ? nextHandler.handleLog(message, level); // 傳遞給下一級
? ? ? ? }
? ? }
}
// DEBUG 級別日志處理器
public class DebugLogger extends LoggerHandler {
? ? @Override
? ? public void handleLog(String message, int level) {
? ? ? ? if (level <= LogLevel.DEBUG) {
? ? ? ? ? ? System.out.println("DEBUG: " + message);
? ? ? ? } else if (nextHandler != null) {
? ? ? ? ? ? nextHandler.handleLog(message, level);
? ? ? ? }
? ? }
}
// ERROR 級別日志處理器
public class ErrorLogger extends LoggerHandler {
? ? @Override
? ? public void handleLog(String message, int level) {
? ? ? ? if (level <= LogLevel.ERROR) {
? ? ? ? ? ? System.out.println("ERROR: " + message);
? ? ? ? } // 無需傳遞(鏈的末端)
? ? }
}
// 日志級別常量
class LogLevel {
? ? public static final int INFO = 1;
? ? public static final int DEBUG = 2;
? ? public static final int ERROR = 3;
}
? ? ? ? 3.構建處理鏈
public class LoggerChain {
? ? public static LoggerHandler buildChain() {
? ? ? ? // 創建處理器實例
? ? ? ? LoggerHandler infoLogger = new InfoLogger();
? ? ? ? LoggerHandler debugLogger = new DebugLogger();
? ? ? ? LoggerHandler errorLogger = new ErrorLogger();
? ? ? ? // 設置鏈式關系
? ? ? ? infoLogger.setNextHandler(debugLogger);
? ? ? ? debugLogger.setNextHandler(errorLogger);
? ? ? ? return infoLogger; // 返回鏈的起點
? ? }
}
? ? ? ? 4.使用責任鏈
public class Main {
? ? public static void main(String[] args) {
? ? ? ? LoggerHandler chain = LoggerChain.buildChain();
? ? ? ? // 測試日志處理
? ? ? ? chain.handleLog("App started", LogLevel.INFO); ? ?// INFO: App started
? ? ? ? chain.handleLog("Network error", LogLevel.ERROR); // ERROR: Network error
? ? ? ? chain.handleLog("Debug data", LogLevel.DEBUG); ? ?// DEBUG: Debug data
? ? }
}
五、優缺點:
優點:
? ? ? ? 1.解耦請求發送者與處理者。
? ? ? ? 2.動態調整處理順序。
? ? ? ? 3.符合單一職責原則。
缺點:
? ? ? ? 1.請求可能未被處理。
? ? ? ? 2.調試困難,需要跟蹤鏈傳遞過程。
? ? ? ? 3.性能損耗,長鏈影響效率。