一、定义:
使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系将这些对象连城一条链,并沿着这条链传递该请求,只到有对象处理它为止。
二、模式结构:
抽象处理者(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.性能损耗,长链影响效率。