責任鏈模式顧名思義,對於一個請求會去建立一條接受者鏈。這種模式會解耦一種類型的請求中接受者和發送者,該模式模式屬於行爲模式的一種。
在該模式當中,通常狀況下,每一個接受者都會有另一個接受者的引用,若是該接受者沒法處理該請求,請求會經過引用傳入下一個接受者。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.