参考:B站动力节点
责任链模式
定义:为请求创建了一个接收者对象的链。对请求的发送者和接收者进行解耦。该模式下,通常每个接收者包含另一个接收者的引用,如果一个对象不能处理该请求则会传给下一个,以此类推,形成链式结构。
举例说明,日志类打印日志,若出现报错,则转由下一级报错类打印报错信息,以此类推。
public abstract class AbstractLogger{
public static int INFO = 1;
public static int DEBUG = 2;
public static int ERROR = 3;
protected int level;
private AbstractLogger nextLogger;
public void setNextLogger(AbstractLogger nextLogger) {
this.nextLogger = nextLogger;
}
public void logMessage(int level, String message) {
if (this.level <= level) {
write(message);
}
if (nextLogger != null) {
nextLogger.logMessage(level, message);
}
}
public abstract void write(String message);
}
先设计一个抽象类AbstractLogger
,该类中提供了基础功能并可以定义下一级Logger
。接下来定义各级别具体实现类:
public class InfoLogger extends AbstractLogger {
public InfoLogger(int level){
this.level = level;
}
@Override
protected void write(String message) {
System.out.println("INFO LOGGER :::>>>" + message);
}
}
public class DebugLogger extends AbstractLogger {
public DebugLogger(int level){
this.level = level;
}
@Override
protected void write(String message) {
System.out.println("DEBUG LOGGER :::>>>" + message);
}
}
public class ErrorLogger extends AbstractLogger {
public ErrorLogger (int level){
this.level = level;
}
@Override
protected void write(String message) {
System.out.println("ERROR LOGGER :::>>>" + message);
}
}
在测试类中,先定义链式关系,然后输入不同级别系信息。
public class Test{
public static AbstractLogger getChainOfLogger(){
AbstractLogger infoLogger = new AbstractLogger(AbstractLogger.INFO);
AbstractLogger debugLogger = new AbstractLogger(AbstractLogger.DEBUG);
AbstractLogger errorLogger = new AbstractLogger(AbstractLogger.ERROR);
infoLogger.setNextLogger(debugLogger);
debugLogger.setNextLogger(errorLogger);
return infoLogger;
}
public static void main(String[] args) {
AbstractLogger logger = getChainOfLogger();
logger.logMessage(AbstractLogger.INFO, " 这是一个INFO级别的日志记录");
logger.logMessage(AbstractLogger.DEBUG, " 这是一个DEBUG级别的日志记录");
logger.logMessage(AbstractLogger.ERROR, " 这是一个ERROR级别的日志记录");
}
}
打印结果:
INFO LOGGER :::>>> 这是一个INFO级别的日志记录
INFO LOGGER :::>>> 这是一个DEBUG级别的日志记录
DEBUG LOGGER :::>>> 这是一个DEBUG级别的日志记录
INFO LOGGER :::>>> 这是一个ERROR级别的日志记录
DEBUG LOGGER :::>>> 这是一个ERROR级别的日志记录
ERRORLOGGER :::>>> 这是一个ERROR级别的日志记录
总结:当传入高级别日志记录时,会不断传入下一级别的Logger
类中处理,和实际上的报错日志很相似,重点理解责任链模式的链式传递。