责任链模式顾名思义,对于一个请求会去建立一条接受者链。这种模式会解耦一种类型的请求中接受者和发送者,该模式模式属于行为模式的一种。
在该模式当中,通常状况下,每一个接受者都会有另一个接受者的引用,若是该接受者没法处理该请求,请求会经过引用传入下一个接受者。java
咱们建立一个抽象类AbstaractLogger,该类中含有日志的记录等级。而后咱们会建立三个logger实现AbstractLogger。每个logger都会检查而且比较消息的等级与该logger等级,判断打印或者不打印,而且传递消息到下一个logger。ide
建立一个抽象的Logger类this
AbstractLogger.javaspa
public abstract class AbstractLogger { public static int INFO = 1; public static int DEBUG = 2; public static int ERROR = 3; protected int level; //next element in chain or responsibility protected 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); } } abstract protected void write(String message); }
建立具体的类实现AtstractLoggerdebug
ConsoleLogger.java日志
public class ConsoleLogger extends AbstractLogger { public ConsoleLogger(int level){ this.level = level; } @Override protected void write(String message) { System.out.println("Standard Console::Logger: " + message); } }
ErrorLogger.javacode
public class ErrorLogger extends AbstractLogger { public ErrorLogger(int level){ this.level = level; } @Override protected void write(String message) { System.out.println("Error Console::Logger: " + message); } }
FileLogger.javaorm
public class FileLogger extends AbstractLogger { public FileLogger(int level){ this.level = level; } @Override protected void write(String message) { System.out.println("File::Logger: " + message); } }
建立不一样类型的logger。设置每一个Logger的错误等级以及每一个logger的Next logger,每个logger的NextLogger都是当前链的一部分。blog
ChainPatternDemo.javaip
public class ChainPatternDemo { private static AbstractLogger getChainOfLoggers(){ AbstractLogger errorLogger = new ErrorLogger(AbstractLogger.ERROR); AbstractLogger fileLogger = new FileLogger(AbstractLogger.DEBUG); AbstractLogger consoleLogger = new ConsoleLogger(AbstractLogger.INFO); errorLogger.setNextLogger(fileLogger); fileLogger.setNextLogger(consoleLogger); return errorLogger; } public static void main(String[] args) { AbstractLogger loggerChain = getChainOfLoggers(); loggerChain.logMessage(AbstractLogger.INFO, "This is an information."); loggerChain.logMessage(AbstractLogger.DEBUG, "This is an debug level information."); loggerChain.logMessage(AbstractLogger.ERROR, "This is an error information."); } }
校验输出
Standard Console::Logger: This is an information. File::Logger: This is an debug level information. Standard Console::Logger: This is an debug level information. Error Console::Logger: This is an error information. File::Logger: This is an error information. Standard Console::Logger: This is an error information.