1、简述
责任链模式是一种行为型设计模式,用于通过将请求沿着一条链传递来处理请求,直到链上的某个处理者能够处理它为止。该模式能够动态地组织多个处理对象,避免请求发送者和接收者之间的直接耦合。
本文将详细介绍责任链模式的概念、结构、优缺点以及实际应用案例。
设计模式样例:https://gitee.com/lhdxhl/design-pattern-example.git
2、 什么是责任链模式?
责任链模式的核心思想是将请求的发送者与接收者解耦,允许多个对象都有机会处理请求。这些对象被连接成一条链,并沿着链传递请求,直到某个对象处理完成或链结束。
典型的例子包括:
- 审批流程中的层级审批。
- Web 应用中的过滤器链。
- 日志记录器(Logger)的多级别处理。
责任链模式包含以下角色:
- 处理者(Handler):定义处理请求的接口,并可选择将请求传递给下一个处理者。
- 具体处理者(ConcreteHandler):实现处理者接口,处理请求或将其传递给下一个处理者。
- 客户端(Client):创建链并发送请求。
类图如下:
Handler <--- ConcreteHandler1
| |
+-------> ConcreteHandler2
3、实际案例
假设我们需要实现一个日志记录器系统,不同的日志级别由不同的记录器处理,例如 DEBUG、INFO 和 ERROR。我们可以使用责任链模式来实现。
// 抽象处理者
public abstract class Logger {
public static int DEBUG = 1;
public static int INFO = 2;
public static int ERROR = 3;
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);
}
}
protected abstract void write(String message);
}
// 具体处理者
public class ConsoleLogger extends Logger {
public ConsoleLogger(int level) {
this.level = level;
}
@Override
protected void write(String message) {
System.out.println("Console Logger: " + message);
}
}
public class FileLogger extends Logger {
public FileLogger(int level) {
this.level = level;
}
@Override
protected void write(String message) {
System.out.println("File Logger: " + message);
}
}
public class ErrorLogger extends Logger {
public ErrorLogger(int level) {
this.level = level;
}
@Override
protected void write(String message) {
System.out.println("Error Logger: " + message);
}
}
// 测试类
public class ChainOfResponsibilityDemo {
private static Logger getChainOfLoggers() {
Logger errorLogger = new ErrorLogger(Logger.ERROR);
Logger fileLogger = new FileLogger(Logger.INFO);
Logger consoleLogger = new ConsoleLogger(Logger.DEBUG);
errorLogger.setNextLogger(fileLogger);
fileLogger.setNextLogger(consoleLogger);
return errorLogger;
}
public static void main(String[] args) {
Logger loggerChain = getChainOfLoggers();
loggerChain.logMessage(Logger.DEBUG, "This is a DEBUG level message.");
loggerChain.logMessage(Logger.INFO, "This is an INFO level message.");
loggerChain.logMessage(Logger.ERROR, "This is an ERROR level message.");
}
}
输出:
Console Logger: This is a DEBUG level message.
File Logger: This is an INFO level message.
Console Logger: This is an INFO level message.
Error Logger: This is an ERROR level message.
File Logger: This is an ERROR level message.
Console Logger: This is an ERROR level message.
4、责任链模式的优缺点
优点
- 解耦:发送者与接收者之间解耦,增强系统的灵活性。
- 灵活性:可以动态地添加或删除处理者。
- 单一职责原则:每个处理者只专注于处理自己负责的请求。
缺点
- 请求无保证处理:如果链上的处理者都不能处理请求,可能导致请求丢失。
- 调试困难:链的动态性可能增加调试的复杂性。
5. 应用场景
- 审批流:如报销单的逐级审批。
- 日志处理:不同级别的日志由不同的处理器处理。
- 过滤器链:如 Web 应用中的请求过滤。
6、总结
责任链模式提供了一种灵活的请求处理方式,通过将多个处理者串联成链,避免了请求发送者与接收者之间的耦合。其在复杂的业务场景中表现出色,尤其是需要动态调整处理逻辑的场景。
希望本文对您理解和应用责任链模式有所帮助!欢迎交流讨论!
评论区