Java设计模式——责任链模式
⚪责任链模式(Chain of Responsibility)是一种行为型设计模式,责任链模式将这些对象组成一条链,并依次传递请求,直到有一个对象能够处理它为止。
⚪意图:它用于处理一个请求可能被多个对象中的一个或多个对象处理的情况。
⚪以下是工厂方法模式的关键要点:
▷ 角色和责任:
- Handler(处理者): 定义一个处理请求的接口。通常包括一个处理请求的方法。它可以是抽象类或接口,也可以是具体类,具体类中包含了对请求的处理逻辑。处理者通常包含一个指向下一个处理者的引用。
- ConcreteHandler(具体处理者): 实现Handler接口的具体处理类。它负责处理请求,如果自己能够处理则处理,否则将请求传递给下一个处理者。
- Client(客户端): 创建一个请求并将其发送给处理者链中的第一个处理者,然后等待处理结果。
▷ 工作流程:
- 客户端创建一个请求对象。
- 请求对象被传递给处理者链中的第一个处理者。
- 处理者尝试处理请求,如果它能够处理,则处理请求并返回结果,否则将请求传递给下一个处理者。
- 这个过程持续下去,直到某个处理者成功地处理了请求,或者请求到达了链的末尾仍然没有被处理。
▷ 示例
import jdk.jfr.internal.LogLevel;
//处理者接口
abstract class Logger {
protected Logger nextLogger;
public void setNextLogger(Logger nextLogger) {
this.nextLogger = nextLogger;
}
public abstract void logMessage(LogLevel level, String message);
}
//具体的处理者类1
class ConsoleLogger extends Logger {
public void logMessage(LogLevel level, String message) {
if (level == LogLevel.INFO) {
System.out.println("Console Logger: " + message);
} else if (nextLogger != null) {
nextLogger.logMessage(level, message);
}
}
}
//具体的处理者类2
class FileLogger extends Logger {
public void logMessage(LogLevel level, String message) {
if (level == LogLevel.WARN || level == LogLevel.INFO) {
System.out.println("File Logger: " + message);
} else if (nextLogger != null) {
nextLogger.logMessage(level, message);
}
}
}
//具体的处理者类3
class ErrorLogger extends Logger {
public void logMessage(LogLevel level, String message) {
if (level == LogLevel.ERROR) {
System.out.println("Error Logger: " + message);
} else if (nextLogger != null) {
nextLogger.logMessage(level, message);
}
}
}
public class Chain {
public static void main(String[] args) {
Logger consoleLogger = new ConsoleLogger();
Logger fileLogger = new FileLogger();
Logger errorLogger = new ErrorLogger();
consoleLogger.setNextLogger(fileLogger);
fileLogger.setNextLogger(errorLogger);
consoleLogger.logMessage(LogLevel.INFO, "This is an information message.");
consoleLogger.logMessage(LogLevel.WARN, "This is a warn message.");
consoleLogger.logMessage(LogLevel.ERROR, "This is an error message.");
}
}
⚪适用性
- 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
- 想在不明确指定接收者的情况下向多个对象中的一个提交一个请求。
- 可处理一个请求的对象集合应被动态指定。
⚪应用场景
- 请求的处理具有多个可能的处理者: 当一个请求可能被多个对象中的一个或多个对象处理,而发送方不知道实际的处理者是谁时,责任链模式非常有用。这种情况下,责任链模式可以帮助将请求传递给适当的处理者。
- 请求的处理顺序不确定或可配置: 如果请求的处理顺序是不确定的,或者需要在运行时动态配置处理顺序,责任链模式可以提供一种有效的解决方案。
- 避免发送者与接收者之间的紧耦合: 使用责任链模式,发送者不需要知道请求的具体处理者,从而减少了发送者和接收者之间的耦合度。
⚪实际已有场景
- Java 中的日志记录库: 许多 Java 日志记录库(例如,Log4j、Logback)使用责任链模式来处理日志消息。不同级别的日志消息会被传递给不同的日志处理器,然后按照配置的顺序进行处理。
- Servlet 过滤器: 在 Java 的 Servlet 编程中,Servlet 过滤器也使用了责任链模式。多个过滤器可以按照配置的顺序依次处理 HTTP 请求,每个过滤器可以决定是否继续传递请求或者中止处理。
- Spring 中的拦截器(HandlerInterceptor): 在 Spring 框架中,拦截器允许你在请求进入控制器之前或之后执行一些操作。你可以配置多个拦截器,它们按照配置的顺序依次处理请求。
- Spring Security: Spring Security 是 Spring 家族中处理安全性的框架,它使用责任链模式来处理认证和授权请求。多个安全过滤器依次处理请求,每个过滤器负责不同的安全性任务。
- Spring AOP(面向切面编程): 在 Spring 中,AOP 也可以使用责任链模式来创建一系列切面,每个切面可以在方法调用前后执行一些操作,例如日志记录、事务管理等。

浙公网安备 33010602011771号