一、责任链模式基本介绍:
- ①:责任链模式
(Chain of Responsibility Pattern),为请求创建了一个接收者对象的链。这种模式对请求的发送者、接收者进行了解耦。 - ②:避免请求发送者与请求接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。。
- ③:职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了。
- ④:在处理消息的时候以过滤很多道。
- ⑤:这种设计模式属于行为模式。

二、案例代码如下:
我们创建抽象类AbstractLogger,带有详细的日志记录级别。然后我们创建三种类型的记录器,都扩展了 AbstractLogger。
判断每个LoggerRequest请求的日志级别,是否属于AbstractLogger具体实现类的级别。如果是则相应地打印出来,否则将不打印并把消息传给下一个记录器。
LoggerLevel日志级别枚举类:
/*日志等级*/public enum LoggerLevel {INFO("INFO", 1), DEBUG("DEBUG", 2), ERROR("ERROR", 3);private String msg;private int level;LoggerLevel(String msg, int loggerLevel) {this.msg = msg;this.level = loggerLevel;}public String getMsg() {return msg;}public int getLevel() {return level;}}
LoggerRequest日志的请求发送者类:
@Datapublic class LoggerRequest {/*请求的ID*/private String requestId;/*请求的名称*/private String requestName;/*请求的日志级别*/private LoggerLevel loggerLevel;/*请求的信息*/private String msg;public LoggerRequest(String requestId, String requestName, LoggerLevel loggerLevel, String msg) {this.requestId = requestId;this.requestName = requestName;this.loggerLevel = loggerLevel;this.msg = msg;}}
创建抽象的AbstractLogger日志记录类。
public abstract class AbstractLogger {/*具体某个`AbstractLogger`实现类对象中的“日志等级”*/protected LoggerLevel loggerLevel;/*责任链中的下一个元素*/protected AbstractLogger nextLogger;public AbstractLogger(LoggerLevel loggerLevel, AbstractLogger nextLogger) {this.loggerLevel = loggerLevel;this.nextLogger = nextLogger;}public void setNextLogger(AbstractLogger nextLogger) {this.nextLogger = nextLogger;}public void logMessage(LoggerRequest loggerRequest) {if (this.loggerLevel.getLevel() <= loggerRequest.getLoggerLevel().getLevel()) {write(loggerRequest);}if (nextLogger != null) {nextLogger.logMessage(loggerRequest);}}protected abstract void write(LoggerRequest loggerRequest);@Overridepublic String toString() {return "AbstractLogger{" + "loggerLevel=" + loggerLevel + ", nextLogger=" + nextLogger + '}';}}
创建AbstractLogger的具体实现类ConsoleLogger:
public class ConsoleLogger extends AbstractLogger {public ConsoleLogger(LoggerLevel loggerLevel, AbstractLogger nextLogger) {super(loggerLevel, nextLogger);}/*不同日记记录,有其处理基本。如下是简单例子*/@Overrideprotected void write(LoggerRequest loggerRequest) {System.out.println(StrUtil.format("请求: {},已经过 {} 处理!", loggerRequest, this.getClass().getSimpleName()));}}
创建AbstractLogger的具体实现类FileLogger:
public class FileLogger extends AbstractLogger {public FileLogger(LoggerLevel loggerLevel, AbstractLogger nextLogger) {super(loggerLevel, nextLogger);}/*不同日记记录,有其处理基本。如下是简单例子*/@Overrideprotected void write(LoggerRequest loggerRequest) {System.out.println(StrUtil.format("请求: {},已经过 {} 处理!", loggerRequest, this.getClass().getSimpleName()));}}
创建AbstractLogger的具体实现类ErrorLogger:
public class ErrorLogger extends AbstractLogger {public ErrorLogger(LoggerLevel loggerLevel, AbstractLogger nextLogger) {super(loggerLevel, nextLogger);}/*不同日记记录,有其处理基本。如下是简单例子*/@Overrideprotected void write(LoggerRequest loggerRequest) {System.out.println(StrUtil.format("请求: {},已经过 {} 处理!", loggerRequest, this.getClass().getSimpleName()));}}
创建不同类型的日志处理器,赋予它们不同的错误级别,并在每个记录器中设置下一个记录器。每个记录器中的下一个日志处理器代表的是链的一部分。发送不同的LoggerRequest请求 给 日志处理器链,来进行处理。
public class Client {public static void main(String[] args) {AbstractLogger loggerChain = new ConsoleLogger(LoggerLevel.INFO,new FileLogger(LoggerLevel.DEBUG,new ErrorLogger(LoggerLevel.ERROR, null)));System.out.println("\n=================【处理 info_request 请求】================");LoggerRequest info_request = new LoggerRequest(IdUtil.simpleUUID(), "INFO_REQUEST", LoggerLevel.INFO, "This is a info level information...");loggerChain.logMessage(info_request);System.out.println("\n=================【处理 debug_request 请求】================");LoggerRequest debug_request = new LoggerRequest(IdUtil.simpleUUID(), "DEBUG_REQUEST", LoggerLevel.DEBUG, "This is a debug level information...");loggerChain.logMessage(debug_request);System.out.println("\n=================【处理 error_request 请求】================");LoggerRequest error_request = new LoggerRequest(IdUtil.simpleUUID(), "ERROR_REQUEST", LoggerLevel.ERROR, "This is a error level information...");loggerChain.logMessage(error_request);}}
输出如下:
=================【处理 info_request 请求】================请求: LoggerRequest(requestId=01c1e5e8b26946cd8ed1a495761a613a, requestName=INFO_REQUEST, loggerLevel=INFO, msg=This is a info level information...),已经过 ConsoleLogger 处理!=================【处理 debug_request 请求】================请求: LoggerRequest(requestId=6e273906345d4b8f94f8c4d189f07179, requestName=DEBUG_REQUEST, loggerLevel=DEBUG, msg=This is a debug level information...),已经过 ConsoleLogger 处理!请求: LoggerRequest(requestId=6e273906345d4b8f94f8c4d189f07179, requestName=DEBUG_REQUEST, loggerLevel=DEBUG, msg=This is a debug level information...),已经过 FileLogger 处理!=================【处理 error_request 请求】================请求: LoggerRequest(requestId=edd2cb592b274696a37ad1a9e14f949f, requestName=ERROR_REQUEST, loggerLevel=ERROR, msg=This is a error level information...),已经过 ConsoleLogger 处理!请求: LoggerRequest(requestId=edd2cb592b274696a37ad1a9e14f949f, requestName=ERROR_REQUEST, loggerLevel=ERROR, msg=This is a error level information...),已经过 FileLogger 处理!请求: LoggerRequest(requestId=edd2cb592b274696a37ad1a9e14f949f, requestName=ERROR_REQUEST, loggerLevel=ERROR, msg=This is a error level information...),已经过 ErrorLogger 处理!
