责任链模式定义
责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,允许将请求沿着处理链传递,直到有一个处理者能够处理该请求。这种模式解耦了请求的发送者和接收者,允许多个对象有机会处理请求,责任链模式通过分离请求和处理逻辑,提供了一种灵活的任务分配机制,适用于需要动态指定处理对象的场景。
核心组件
Handler(抽象处理者)
定义处理请求的接口,通常包含一个指向下一个处理者的引用(后继者)
public abstract class Handler {
protected Handler successor;
public void setSuccessor(Handler successor) {
this.successor = successor;
}
public abstract void handleRequest(Request request);
}
ConcreteHandler(具体处理者)
实现抽象处理者的接口,决定是否处理请求或将其传递给链中的下一个处理者
public class ConcreteHandlerA extends Handler {
@Override
public void handleRequest(Request request) {
if (request.getType().equals("TypeA")) {
// 处理请求
} else if (successor != null) {
successor.handleRequest(request);
}
}
}
Request(请求)
封装请求的细节,通常包含处理所需的参数或类型
public class Request {
private String type;
// 其他字段及方法
}
典型应用场景
多级审批流程:如请假审批需经过部门经理、HR、CEO等层级。
事件处理系统:如GUI中的事件冒泡机制。
日志过滤:不同级别的日志(DEBUG、INFO、ERROR)由不同处理器处理。
示例代码
以下是一个简单责任链实现:
// 抽象处理者
abstract class Logger {
public static int INFO = 1;
public static int DEBUG = 2;
protected int level;
protected Logger nextLogger;
public void setNextLogger(Logger nextLogger) {
this.nextLogger = nextLogger;
}
public void logMessage(int level, String message) {
if (this.level <= level) {
write(message);
}
if (nextLogger != null) {
nextLogger.logMessage(level, message);
}
}
abstract protected void write(String message);
}
// 具体处理者
class ConsoleLogger extends Logger {
public ConsoleLogger(int level) {
this.level = level;
}
@Override
protected void write(String message) {
System.out.println("Console: " + message);
}
}