责任链模式(Chain of Responsiblity Pattern) 为这种请求创建了一个接受者的链。这种模式给予请求的类型
这种模式给予请求的类型 对请求的发送者和接受者进行解偶。 这种类型的设计模式属于行为模式。
在这种模式中,通常每个接受者都包含对另一个接受者的引用 如果一个对象不能处理该请求 那么它会把相同的请求传递给下一个请求。
意图:避免请求发送者与接受者耦合在一起,让多个对象有可能接受请求将这些连成一条链,并且沿着这条链传递请求,直到有对象处理为值。
下面是demo.
package com.royan.weakey.platform.pattern.chainResponsibility; import lombok.Data; import lombok.extern.slf4j.Slf4j; /** * 责任链模式(Chain of Responsibility Pattern) * 为请求创建了一个接受者对象的链。这种模式给予请求的类型 * 这种模式给予请求的类型 对请求的发送者和接受者进行解偶。 * 这种类型的设计模式属于行为模式 * <p> * 在这种模式中,通常每个接受者都包含对另一个接受者的引用 * 如果一个对象不能处理该请求 那么它会把相同的请求下一个接收者 * <p> * 意图:避免请求发送者与接受者耦合在一起,让多个对象有可能接受请求 * 将这些连成一条链,并且沿着这条链传递请求 直到有对象处理它为止。 */ @Slf4j @Data public abstract class AbstractLogger { enum LogLevel { INFO(1), DEBUG(2), ERROR(3); private int code; LogLevel(int code) { this.code = code; } private int getCode() { return code; } } public AbstractLogger(LogLevel logLevel) { this.logLevel = logLevel; } private LogLevel logLevel; protected AbstractLogger nextLogger; public void logMessage(LogLevel level, String message) { if (this.logLevel.getCode() <= level.getCode()) write(message); if (nextLogger != null) nextLogger.logMessage(level, message); } abstract protected void write(String message); }
package com.royan.weakey.platform.pattern.chainResponsibility; import lombok.extern.slf4j.Slf4j; @Slf4j public class ErrorLogger extends AbstractLogger { public ErrorLogger(LogLevel logLevel) { super(logLevel); } @Override protected void write(String message) { log.info("Error Console::Logger-{}", message); } }
package com.royan.weakey.platform.pattern.chainResponsibility; import lombok.extern.slf4j.Slf4j; @Slf4j public class FileLogger extends AbstractLogger { public FileLogger(LogLevel logLevel) { super(logLevel); } @Override protected void write(String message) { log.info("File::Logger-{}", message); } }
package com.royan.weakey.platform.pattern.chainResponsibility; import lombok.Data; import lombok.extern.slf4j.Slf4j; @Slf4j public class ConsoleLogger extends AbstractLogger { public ConsoleLogger(LogLevel logLevel) { super(logLevel); } @Override protected void write(String message) { log.info("Standard Console::Logger-{}", message); } }
package com.royan.weakey.platform.pattern.chainResponsibility; public class ChainPatternDemo { private static AbstractLogger getChainOfLoggers() { AbstractLogger errorLogger = new ErrorLogger(AbstractLogger.LogLevel.ERROR); AbstractLogger fileLogger = new FileLogger(AbstractLogger.LogLevel.DEBUG); AbstractLogger consoleLogger = new ConsoleLogger(AbstractLogger.LogLevel.INFO); errorLogger.setNextLogger(fileLogger); fileLogger.setNextLogger(consoleLogger); return errorLogger; } public static void main(String[] args) { AbstractLogger loggerChain = getChainOfLoggers(); loggerChain.logMessage(AbstractLogger.LogLevel.INFO, "This is an info information"); loggerChain.logMessage(AbstractLogger.LogLevel.DEBUG, "This is a debug level information."); loggerChain.logMessage(AbstractLogger.LogLevel.ERROR, "This is an error information."); } }