责任链设计模式,使链上每个节点都有机会处理请求。将处理对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。
抽象处理者角色: 定义出一个处理请求的接口。如果需要,接口可以定义 出一个方法以设定和返回对下家的引用。这个角色通常由一个Java抽象类或者Java接口实现。
具体处理者角色: 具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。
责任链打印日志代码示例:
抽象处理类
public abstract class Logger {
public static final int DUBEG = 1;
public static final int INFO = 2;
public static final int ERROR = 3;
protected int level = 0;
protected Logger nextLogger;
public Logger getNextLogger() {
return nextLogger;
}
public void logMessage(int level, String message) {
//指定的级别够我就处理
if (level <= this.level) {
write(message);
}
//传递给下家
if (nextLogger != null) {
nextLogger.logMessage(level, message);
}
}
public void setNextLogger(Logger nextLogger) {
this.nextLogger = nextLogger;
}
//由具体执行者实现
protected abstract void write(String message);
}
三个级别的具体处理类
public class Debug extends Logger {
public Debug(int level) {
this.level = level;
}
@Override
public void write(String message) {
System.out.println("[debug]: " + message);
}
}
public class Info extends Logger {
public Info(int level) {
this.level = level;
}
@Override
public void write(String message) {
System.out.println("[info]: " + message);
}
}
public class Error extends Logger {
public Error(int level) {
this.level = level;
}
@Override
public void write(String message) {
System.out.println("[error]: " + message);
}
}
责任链工厂,包装处理链
public final class LoggerFactory {
public static Logger getLogger() {
// 初始化责任链节点
Logger debug = new Debug(Logger.DUBEG);
Logger info = new Info(Logger.INFO);
Logger error = new Error(Logger.ERROR);
// 设置责任链关系
info.setNextLogger(error);
debug.setNextLogger(info);
return debug;
}
}
测试
public class LoggerChainTest {
private static final Logger logger = LoggerFactory.getLogger();
public static void main(String args[]) {
//可以通过改变这里的日志级别,控制输出的日志
logger.logMessage(Logger.ERROR, "Hello World");
}
}