美文网首页
责任链模式,是什么类型的模式呢?

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

作者: 程就人生 | 来源:发表于2022-04-30 10:10 被阅读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框架的小伙伴,说到责任链模式,一定再熟悉不过了。服务器端收到聊天消息,有可能是登录请求,有可能是单聊,还有可能是群聊,这时就需要用到责任链模式了。责任链中有处理登录、登出的处理器、单聊的处理器、群聊的处理器,每种消息会被对应类型的处理器处理,业务逻辑相互独立,互不干扰。

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

    相关文章

      网友评论

          本文标题:责任链模式,是什么类型的模式呢?

          本文链接:https://www.haomeiwen.com/subject/wrndyrtx.html