一、责任链模式基本介绍:

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

责任链模式 - 图1

二、案例代码如下:

我们创建抽象类AbstractLogger,带有详细的日志记录级别。然后我们创建三种类型的记录器,都扩展了 AbstractLogger
判断每个LoggerRequest请求的日志级别,是否属于AbstractLogger具体实现类的级别。如果是则相应地打印出来,否则将不打印并把消息传给下一个记录器。

LoggerLevel日志级别枚举类:

  1. /*日志等级*/
  2. public enum LoggerLevel {
  3. INFO("INFO", 1), DEBUG("DEBUG", 2), ERROR("ERROR", 3);
  4. private String msg;
  5. private int level;
  6. LoggerLevel(String msg, int loggerLevel) {
  7. this.msg = msg;
  8. this.level = loggerLevel;
  9. }
  10. public String getMsg() {
  11. return msg;
  12. }
  13. public int getLevel() {
  14. return level;
  15. }
  16. }

LoggerRequest日志的请求发送者类:

  1. @Data
  2. public class LoggerRequest {
  3. /*请求的ID*/
  4. private String requestId;
  5. /*请求的名称*/
  6. private String requestName;
  7. /*请求的日志级别*/
  8. private LoggerLevel loggerLevel;
  9. /*请求的信息*/
  10. private String msg;
  11. public LoggerRequest(String requestId, String requestName, LoggerLevel loggerLevel, String msg) {
  12. this.requestId = requestId;
  13. this.requestName = requestName;
  14. this.loggerLevel = loggerLevel;
  15. this.msg = msg;
  16. }
  17. }

创建抽象的AbstractLogger日志记录类。

  1. public abstract class AbstractLogger {
  2. /*具体某个`AbstractLogger`实现类对象中的“日志等级”*/
  3. protected LoggerLevel loggerLevel;
  4. /*责任链中的下一个元素*/
  5. protected AbstractLogger nextLogger;
  6. public AbstractLogger(LoggerLevel loggerLevel, AbstractLogger nextLogger) {
  7. this.loggerLevel = loggerLevel;
  8. this.nextLogger = nextLogger;
  9. }
  10. public void setNextLogger(AbstractLogger nextLogger) {
  11. this.nextLogger = nextLogger;
  12. }
  13. public void logMessage(LoggerRequest loggerRequest) {
  14. if (this.loggerLevel.getLevel() <= loggerRequest.getLoggerLevel().getLevel()) {
  15. write(loggerRequest);
  16. }
  17. if (nextLogger != null) {
  18. nextLogger.logMessage(loggerRequest);
  19. }
  20. }
  21. protected abstract void write(LoggerRequest loggerRequest);
  22. @Override
  23. public String toString() {
  24. return "AbstractLogger{" + "loggerLevel=" + loggerLevel + ", nextLogger=" + nextLogger + '}';
  25. }
  26. }

创建AbstractLogger的具体实现类ConsoleLogger

  1. public class ConsoleLogger extends AbstractLogger {
  2. public ConsoleLogger(LoggerLevel loggerLevel, AbstractLogger nextLogger) {
  3. super(loggerLevel, nextLogger);
  4. }
  5. /*不同日记记录,有其处理基本。如下是简单例子*/
  6. @Override
  7. protected void write(LoggerRequest loggerRequest) {
  8. System.out.println(StrUtil.format("请求: {},已经过 {} 处理!", loggerRequest, this.getClass().getSimpleName()));
  9. }
  10. }

创建AbstractLogger的具体实现类FileLogger

  1. public class FileLogger extends AbstractLogger {
  2. public FileLogger(LoggerLevel loggerLevel, AbstractLogger nextLogger) {
  3. super(loggerLevel, nextLogger);
  4. }
  5. /*不同日记记录,有其处理基本。如下是简单例子*/
  6. @Override
  7. protected void write(LoggerRequest loggerRequest) {
  8. System.out.println(StrUtil.format("请求: {},已经过 {} 处理!", loggerRequest, this.getClass().getSimpleName()));
  9. }
  10. }

创建AbstractLogger的具体实现类ErrorLogger

  1. public class ErrorLogger extends AbstractLogger {
  2. public ErrorLogger(LoggerLevel loggerLevel, AbstractLogger nextLogger) {
  3. super(loggerLevel, nextLogger);
  4. }
  5. /*不同日记记录,有其处理基本。如下是简单例子*/
  6. @Override
  7. protected void write(LoggerRequest loggerRequest) {
  8. System.out.println(StrUtil.format("请求: {},已经过 {} 处理!", loggerRequest, this.getClass().getSimpleName()));
  9. }
  10. }

创建不同类型的日志处理器,赋予它们不同的错误级别,并在每个记录器中设置下一个记录器。每个记录器中的下一个日志处理器代表的是链的一部分。发送不同的LoggerRequest请求 给 日志处理器链,来进行处理。

  1. public class Client {
  2. public static void main(String[] args) {
  3. AbstractLogger loggerChain = new ConsoleLogger(LoggerLevel.INFO,
  4. new FileLogger(LoggerLevel.DEBUG,
  5. new ErrorLogger(LoggerLevel.ERROR, null)
  6. )
  7. );
  8. System.out.println("\n=================【处理 info_request 请求】================");
  9. LoggerRequest info_request = new LoggerRequest(IdUtil.simpleUUID(), "INFO_REQUEST", LoggerLevel.INFO, "This is a info level information...");
  10. loggerChain.logMessage(info_request);
  11. System.out.println("\n=================【处理 debug_request 请求】================");
  12. LoggerRequest debug_request = new LoggerRequest(IdUtil.simpleUUID(), "DEBUG_REQUEST", LoggerLevel.DEBUG, "This is a debug level information...");
  13. loggerChain.logMessage(debug_request);
  14. System.out.println("\n=================【处理 error_request 请求】================");
  15. LoggerRequest error_request = new LoggerRequest(IdUtil.simpleUUID(), "ERROR_REQUEST", LoggerLevel.ERROR, "This is a error level information...");
  16. loggerChain.logMessage(error_request);
  17. }
  18. }

输出如下:

  1. =================【处理 info_request 请求】================
  2. 请求: LoggerRequest(requestId=01c1e5e8b26946cd8ed1a495761a613a, requestName=INFO_REQUEST, loggerLevel=INFO, msg=This is a info level information...),已经过 ConsoleLogger 处理!
  3. =================【处理 debug_request 请求】================
  4. 请求: LoggerRequest(requestId=6e273906345d4b8f94f8c4d189f07179, requestName=DEBUG_REQUEST, loggerLevel=DEBUG, msg=This is a debug level information...),已经过 ConsoleLogger 处理!
  5. 请求: LoggerRequest(requestId=6e273906345d4b8f94f8c4d189f07179, requestName=DEBUG_REQUEST, loggerLevel=DEBUG, msg=This is a debug level information...),已经过 FileLogger 处理!
  6. =================【处理 error_request 请求】================
  7. 请求: LoggerRequest(requestId=edd2cb592b274696a37ad1a9e14f949f, requestName=ERROR_REQUEST, loggerLevel=ERROR, msg=This is a error level information...),已经过 ConsoleLogger 处理!
  8. 请求: LoggerRequest(requestId=edd2cb592b274696a37ad1a9e14f949f, requestName=ERROR_REQUEST, loggerLevel=ERROR, msg=This is a error level information...),已经过 FileLogger 处理!
  9. 请求: LoggerRequest(requestId=edd2cb592b274696a37ad1a9e14f949f, requestName=ERROR_REQUEST, loggerLevel=ERROR, msg=This is a error level information...),已经过 ErrorLogger 处理!