责任链模式是一种行为设计模式,使得多个处理者能够在处理请求时形成一个链条。每个处理者都有机会处理请求,但如果当前处理者无法处理,则将请求传递给链中的下一个处理者。
- Handler(处理者):定义处理请求的接口,并包含对下一个处理者的引用。
- ConcreteHandler(具体处理者):实现处理请求的具体逻辑,并决定是否处理请求或将其传递给下一个处理者。
- Client(客户端):发起请求并将请求发送到责任链的头部。
假设我们有一个日志处理系统,日志可以经过不同级别的处理:InfoHandler
、WarningHandler
和ErrorHandler
。
abstract class Logger {
public static int INFO = 1;
public static int WARNING = 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);
}
class InfoLogger extends Logger {
public InfoLogger() {
this.level = Logger.INFO;
}
@Override
protected void write(String message) {
System.out.println("Info: " + message);
}
}
class WarningLogger extends Logger {
public WarningLogger() {
this.level = Logger.WARNING;
}
@Override
protected void write(String message) {
System.out.println("Warning: " + message);
}
}
class ErrorLogger extends Logger {
public ErrorLogger() {
this.level = Logger.ERROR;
}
@Override
protected void write(String message) {
System.out.println("Error: " + message);
}
}
public class ChainPatternDemo {
public static void main(String[] args) {
Logger infoLogger = new InfoLogger();
Logger warningLogger = new WarningLogger();
Logger errorLogger = new ErrorLogger();
// 设置责任链
infoLogger.setNextLogger(warningLogger);
warningLogger.setNextLogger(errorLogger);
// 发送不同级别的日志
infoLogger.logMessage(Logger.INFO, "This is an info message.");
infoLogger.logMessage(Logger.WARNING, "This is a warning message.");
infoLogger.logMessage(Logger.ERROR, "This is an error message.");
}
}
Info: This is an info message.
Warning: This is a warning message.
Error: This is an error message.
责任链模式将请求的处理者解耦,允许在运行时改变处理链的结构。通过这种方式,可以灵活添加或更换处理者,而无需修改现有的代码结构,非常适合处理可变或动态的请求处理场景。