最近在OKHttp源码的时候看到了Intercept接口,了解到了其中运用的设计模式—-责任链模式。回想起了曾经学习struts时候的拦截器,感觉很想,决定了解下什么是责任链模式。
先写一个小的demo:模拟日志输出。
日志基类:
public abstract class BaseLogger {
private int level;
private BaseLogger nextLogger;
abstract void log(String message);
public void showLog(String message) {
log(message);
if (null != nextLogger && level < nextLogger.level) {
nextLogger.showLog(message);
}
}
public BaseLogger(int level, BaseLogger nextLogger) {
super();
this.level = level;
this.nextLogger = nextLogger;
}
}
verbose日志:
public class VerboseLogger extends BaseLogger {
public VerboseLogger(int level, BaseLogger nextLogger) {
super(level, nextLogger);
}
void log(String message) {
System.out.println(message+"VerboseLogger");
}
}
debug日志:
public class DebugLogger extends BaseLogger {
public DebugLogger(int level, BaseLogger nextLogger) {
super(level, nextLogger);
}
public void showLog(String message, BaseLogger nextLogger) {
//if () {}
log(message);
}
void log(String message) {
System.out.println(message+"DebugLogger");
}
}
error日志:
public class ErrorLogger extends BaseLogger {
public ErrorLogger(int level, BaseLogger nextLogger) {
super(level, nextLogger);
}
void log(String message) {
System.out.println(message+"ErrorLogger");
}
}
在安卓里,三种日志应该是,如果输出verbose日志,那么debug,error都会输出,如果是debug日志,那么error会输出,如果是error则只有error输出。对应的就是代码中的日志的级别,级别大于当前的日志都会输出。测试代码:
public class ChainTest {
public static void main(String[] args) {
BaseLogger absLog1 = new VerboseLogger(1, new DebugLogger(2, new ErrorLogger(3, null)));
absLog1.showLog("wahaha");
System.out.println("---------------------------------------");
BaseLogger absLog2 = new DebugLogger(2, new ErrorLogger(3, new VerboseLogger(2, null)));
absLog2.showLog("wahaha");
System.out.println("---------------------------------------");
BaseLogger absLog3 = new ErrorLogger(3, new DebugLogger(2, new VerboseLogger(1, null)));
absLog3.showLog("wahaha");
}
}
结果:
wahahaVerboseLogger
wahahaDebugLogger
wahahaErrorLogger
wahahaDebugLogger
wahahaErrorLogger
wahahaErrorLogger