责任链模式,是什么类型的模式呢?

2022-04-30  本文已影响0人  程就人生

你的项目中有用到责任链模式吗?

责任链模式主要解决什么问题呢?

有哪些框架涉及到责任链模式,你知道吗?

责任链模式(chain of responsibility pattern),为请求创建了一个接收者对象的链,将请求与处理解耦,是一种行为型模式。 业务场景:一个请求,多种对象处理的情况;主要为了解决请求和处理对象的耦合。 关键代理:处理类里聚合了自己,接收到请求后,符合条件就处理;否则就传递给下一个类处理。
下面看UML类图:

代码实现步骤:
1.日志抽象类;

/**
 * 1.日志抽象类
 * @author 程就人生
 * @Date
 */
public abstract class AbstractLogger {

  // 一般的日志信息
  public static int INFO = 1;
  // debug版本打印的信息
  public static int DEBUG = 2;
  // 只打印错误信息
  public static int ERROR = 3;
  
  protected int level;
  
  // 责任链中的下一个元素
  protected AbstractLogger nextLogger;
  
  public void setNextLogger(AbstractLogger nextLogger) {
    this.nextLogger = nextLogger;
  }  
  
  public void logMessage(int level, String msg){
    // 如果日志打印级别等于当前级别,则打印日志信息
    if(this.level <= level){
      write(msg);
    }
    // 如果责任链中的下一个元素不为空,则继续传递下去
    if(nextLogger != null){
      nextLogger.logMessage(level, msg);
    }
  }
  
  // 打印日志
  abstract void write(String msg);
}

2.抽象日志类的继承者3种日志级别;

/**
 * 2.1 基本信息打印类-抽象日志的继承者
 * @author 程就人生
 * @Date
 */
public class InfoLogger extends AbstractLogger{

  public InfoLogger(int level) {
    this.level = level;
  }

  @Override
  void write(String msg) {
    System.out.println("info:" + msg);
  }

}

/**
 * 2.2 debug信息打印类-抽象日志的继承者
 * @author 程就人生
 * @Date
 */
public class DebugLogger extends AbstractLogger{

  public DebugLogger(int level){
    this.level = level;
  }
  
  @Override
  void write(String msg) {
    System.out.println("debug:" + msg);
  }

}

/**
 * 2.3 错误信息打印类-抽象日志的继承者
 * @author 程就人生
 * @Date
 */
public class ErrorLogger extends AbstractLogger{

  public ErrorLogger(int level){
    this.level = level;
  }
  
  @Override
  void write(String msg) {
    System.out.println("error:" + msg);
  }

}

3.日志工厂类,设置日志处理链;

/**
 * 3.对日志进行管理
 * @author 程就人生
 * @Date
 */
public class LoggerFactory {

  // 设置日志处理链
  public static AbstractLogger getChainOfLogger(){
    AbstractLogger errorLogger = new ErrorLogger(AbstractLogger.ERROR);
    AbstractLogger debugLogger = new DebugLogger(AbstractLogger.DEBUG);
    AbstractLogger infoLogger = new InfoLogger(AbstractLogger.INFO);
    // error的下一个处理类是debugLoogger
    errorLogger.setNextLogger(debugLogger);
    // debug的写一个处理类是infoLogger
    debugLogger.setNextLogger(infoLogger);
    return errorLogger;
  }
}

4.测试代码:

public static void main(String[] argo){    
    AbstractLogger logger = LoggerFactory.getChainOfLogger();
    logger.logMessage(AbstractLogger.DEBUG, "debug类日志");    
}    

测试结果:

debug:debug类日志
info:debug类日志

这段代码的意思是:日志输出有三个级别,第一个是info类,第二个为debug类,第三个为error类;如果设置了debug类,那么小于或等于该日志级别的日志类都需要处理,因此输出了debug和info两种打印信息。

最后总结

责任链模式的主要职责就是对请求和处理进行解耦,特别是在一个请求中涉及到多种业务逻辑的场景,可以针对每种业务逻辑写一个处理器,每种业务逻辑之间互不干涉,这就达到了对业务逻辑处理解耦的作用。

做过即时通讯的小伙伴,用过Netty框架的小伙伴,说到责任链模式,一定再熟悉不过了。服务器端收到聊天消息,有可能是登录请求,有可能是单聊,还有可能是群聊,这时就需要用到责任链模式了。责任链中有处理登录、登出的处理器、单聊的处理器、群聊的处理器,每种消息会被对应类型的处理器处理,业务逻辑相互独立,互不干扰。

除此之外,你还能举出其他关于责任链模式的例子吗?

上一篇下一篇

猜你喜欢

热点阅读