1. 作用
解耦,每一阶段只需关心当前的处理,处理完后推送下一节点即可
2. 实现逻辑
定义统一接口及方法;
子类实现方法如execute,并定义成员变量nextNode;
应用时候,创建子类实例,并给实例赋值nextNode;
调用方法execute,execute内部自己方法执行完成后,执行nextNode的execute犯法.
3. 代码
3.1 责任链对象
package com.hz.design.responsechain.logger;
/**
* @description:
* @author: pp_lan
* @date: 2022/3/22
*/
public abstract class AbstractLogger {
public static final int DEBUG = 1;
public static final int INFO = 2;
public static final int ERROR = 3;
protected int level;
protected AbstractLogger nextLogger;
public AbstractLogger() {
}
public AbstractLogger(int level) {
this.level = level;
}
public void setNextLevel(AbstractLogger logger) {
this.nextLogger = logger;
}
public void log(int level, String message) {
if (this.level >= level) {
this.write(message);
}
if (nextLogger != null) {
nextLogger.log(level, message);
}
}
protected abstract void write(String message);
}
package com.hz.design.responsechain.logger;
/**
* @description:
* @author: pp_lan
* @date: 2022/3/22
*/
public class ErrorLogger extends AbstractLogger {
public ErrorLogger(int level) {
super(level);
}
@Override
protected void write(String message) {
System.out.println("Error log: " + message);
}
}
package com.hz.design.responsechain.logger;
/**
* @description:
* @author: pp_lan
* @date: 2022/3/22
*/
public class InfoLogger extends AbstractLogger {
public InfoLogger(int level) {
super(level);
}
@Override
protected void write(String message) {
System.out.println("Info log: " + message);
}
}
package com.hz.design.responsechain.logger;
/**
* @description:
* @author: pp_lan
* @date: 2022/3/22
*/
public class ConsoleLogger extends AbstractLogger {
public ConsoleLogger(int level) {
super(level);
}
@Override
protected void write(String message) {
System.out.println("Console log: " + message);
}
}
3.2 测试(调用)类
package com.hz.design.responsechain;
import com.hz.design.responsechain.logger.AbstractLogger;
import com.hz.design.responsechain.logger.ConsoleLogger;
import com.hz.design.responsechain.logger.ErrorLogger;
import com.hz.design.responsechain.logger.InfoLogger;
import jdk.nashorn.internal.runtime.logging.DebugLogger;
import javax.sound.sampled.Line;
/**
* @description:
* @author: pp_lan
* @date: 2022/3/22
*/
public class ResponseChainTest {
private static AbstractLogger getChainOfLoggers() {
ErrorLogger errorLogger = new ErrorLogger(AbstractLogger.ERROR);
InfoLogger infoLogger = new InfoLogger(AbstractLogger.INFO);
ConsoleLogger consoleLogger = new ConsoleLogger(AbstractLogger.DEBUG);
errorLogger.setNextLevel(infoLogger);
infoLogger.setNextLevel(consoleLogger);
return errorLogger;
}
public static void main(String[] args) {
AbstractLogger loggerChain = getChainOfLoggers();
loggerChain.log(AbstractLogger.INFO, "debug: 打印日志");
}
}
4. 执行结果
Connected to the target VM, address: '127.0.0.1:55228', transport: 'socket'
Error log: debug: 打印日志
Info log: debug: 打印日志
Disconnected from the target VM, address: '127.0.0.1:55228', transport: 'socket'
Process finished with exit code 0