责任链模式
通俗的讲,就好比将所有要处理的对象链接再一条链子上,如果这个对象不能处理,就传递到下一个对象,依次传递,完成请求的转发与处理。
灵魂画师~ 走你
这里用要给漏斗过滤的原理在说明责任链,就好比漏斗的每一层都有一层过滤膜,不同大小的球体进入这个过滤层之后,通过不同的滤网,直到小球无法通过被隔离在上面
,这就好比责任链模式,小球就是一个个请求对象,要是小球的直径小于滤孔,则无法被捕捉处理,只能通过,交给下级处理,直到有滤网可以处理,才停留下来。
例子2
log4j的日志系统是JAVA里面常用的日志,这里只常用四个,从DEBUG开始,到ERROR,
设置不同的日志等级,就会打印出不同的日志,就好比ERROR日志等级只会打印出错误相关的事情,
而DEBUG就会打印出所有信息,这里就按照这个类型来举例子
代码理解
定义一个抽象类,定义出DEBUGINFOERROR 等错误等级的标识以及定义打印日志的方法,
public abstract class AbstractLogger { public int DEBUG = 1; public int INTO = 2; public int ERROR = 3; protected int level; protected AbstractLogger nextLogger; public void logMessage(int level,String message){ if (this.level <= level) { this.log(message); } if (nextLogger != null) { nextLogger.logMessage(level,message); } } public abstract void log(String message); public void setNextLogger(AbstractLogger nextLogger){ this.nextLogger = nextLogger; } }
Console 日志等级为一级,作为最低一级,它的下一级等级为INFO
public class ConsoleLogger extends AbstractLogger { ConsoleLogger(){ this.level = DEBUG; setNextLogger(new FileLogger()); } @Override public void log(String message) { System.out.println("console log:"+message); } }
FileLogger 日志等级为2,INFO日志等级。它的下一级为ErrorLogger
public class FileLogger extends AbstractLogger { FileLogger(){ this.level = INTO; this.setNextLogger(new ErrorLogger()); } @Override public void log(String message) { System.out.println("fileLogger:"+message); } }
//最后一级Error作为等级最高的以及,它没有下级了,所以传递一个Null
public class ErrorLogger extends AbstractLogger { public ErrorLogger(){ this.level = ERROR; this.setNextLogger(null); } @Override public void log(String message) { System.out.println("errorLogger:"+message); } }
测试方法,这里只需要暴露出最低级的ConsoleLogger 即可,然后传递不同类型的错误信息和等级
public static void main(String[] args) { AbstractLogger logger = new ConsoleLogger(); logger.logMessage(3,"错误信息"); System.out.println(); logger.logMessage(2,"发生了错误"); System.out.println(); logger.logMessage(1,"控制台信息"); }
就好比使用Debug 类型错误打印的时候,出现一个Error类型的错误,它都会被输入,但是用Debug类型来处理一个1急别Debug类型,
只会出现一层,不会出现到下一层的Info 一样的道理。