浅谈JAVA 责任链模式

 更新时间:2020年06月29日 10:21:42   作者:菜鸟教程  
这篇文章主要介绍了JAVA 责任链模式的的相关资料,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下

顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。

在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。

介绍

意图:

避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。

主要解决:

职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了。

何时使用:

在处理消息的时候以过滤很多道。

如何解决:

拦截的类都实现统一接口。

关键代码:

Handler 里面聚合它自己,在 HandlerRequest 里判断是否合适,如果没达到条件则向下传递,向谁传递之前 set 进去。

应用实例:

1、红楼梦中的"击鼓传花"。

2、JS 中的事件冒泡。

3、JAVA WEB 中 Apache Tomcat 对 Encoding 的处理,Struts2 的拦截器,jsp servlet 的 Filter。

优点:

1、降低耦合度。它将请求的发送者和接收者解耦。

2、简化了对象。使得对象不需要知道链的结构。

3、增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。

4、增加新的请求处理类很方便。

缺点:

1、不能保证请求一定被接收。

2、系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用。

3、可能不容易观察运行时的特征,有碍于除错。

使用场景:

1、有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定。

2、在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。

3、可动态指定一组对象处理请求。

注意事项:

在 JAVA WEB 中遇到很多应用。

实现

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

步骤 1

创建抽象的记录器类。

public abstract class AbstractLogger {
  public static int INFO = 1;
  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 message){
   if(this.level <= level){
     write(message);
   }
   if(nextLogger !=null){
     nextLogger.logMessage(level, message);
   }
  }
 
  abstract protected void write(String message);
  
}

步骤 2

创建扩展了该记录器类的实体类。

public class ConsoleLogger extends AbstractLogger {
 
  public ConsoleLogger(int level){
   this.level = level;
  }
 
  @Override
  protected void write(String message) {  
   System.out.println("Standard Console::Logger: " + message);
  }
}
public class ErrorLogger extends AbstractLogger {
 
  public ErrorLogger(int level){
   this.level = level;
  }
 
  @Override
  protected void write(String message) {  
   System.out.println("Error Console::Logger: " + message);
  }
}
public class FileLogger extends AbstractLogger {
 
  public FileLogger(int level){
   this.level = level;
  }
 
  @Override
  protected void write(String message) {  
   System.out.println("File::Logger: " + message);
  }
}

步骤 3

创建不同类型的记录器。赋予它们不同的错误级别,并在每个记录器中设置下一个记录器。每个记录器中的下一个记录器代表的是链的一部分。

public class ChainPatternDemo {
  
  private static AbstractLogger getChainOfLoggers(){
 
   AbstractLogger errorLogger = new ErrorLogger(AbstractLogger.ERROR);
   AbstractLogger fileLogger = new FileLogger(AbstractLogger.DEBUG);
   AbstractLogger consoleLogger = new ConsoleLogger(AbstractLogger.INFO);
 
   errorLogger.setNextLogger(fileLogger);
   fileLogger.setNextLogger(consoleLogger);
 
   return errorLogger; 
  }
 
  public static void main(String[] args) {
   AbstractLogger loggerChain = getChainOfLoggers();
 
   loggerChain.logMessage(AbstractLogger.INFO, "This is an information.");
 
   loggerChain.logMessage(AbstractLogger.DEBUG, 
     "This is a debug level information.");
 
   loggerChain.logMessage(AbstractLogger.ERROR, 
     "This is an error information.");
  }
}

步骤 4

执行程序,输出结果:

Standard Console::Logger: This is an information.
File::Logger: This is a debug level information.
Standard Console::Logger: This is a debug level information.
Error Console::Logger: This is an error information.
File::Logger: This is an error information.
Standard Console::Logger: This is an error information.

以上就是浅谈JAVA 责任链模式的详细内容,更多关于JAVA 责任链模式的资料请关注脚本之家其它相关文章!

相关文章

  • springboot集成Mybatis的详细教程

    springboot集成Mybatis的详细教程

    今天给大家带来的还是关于springboot的相关知识,文章围绕着springboot集成Mybatis的详细教程展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • Java编程中静态内部类与同步类的写法示例

    Java编程中静态内部类与同步类的写法示例

    这篇文章主要介绍了Java编程中静态内部类与同步类的写法示例,用于构建静态对象以及实现线程同步等,需要的朋友可以参考下
    2015-09-09
  • 详解Spring基于xml的两种依赖注入方式

    详解Spring基于xml的两种依赖注入方式

    这篇文章主要介绍了详解Spring基于xml的两种依赖注入方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • 排序算法图解之Java冒泡排序及优化

    排序算法图解之Java冒泡排序及优化

    冒泡排序即通过对待排序的序列从前往后,依次比较相邻元素的值,若发现逆序则交换位置,使较大的元素逐渐移动到后部。本文通过图片和示例介绍了冒泡排序的实现及优化,需要的可以参考一下
    2022-11-11
  • SpringBoot实现日志链路追踪的项目实践

    SpringBoot实现日志链路追踪的项目实践

    在分布式系统中,由于请求的处理过程可能会跨越多个服务,因此,对请求的追踪变得尤为重要,本文主要介绍了SpringBoot实现日志链路追踪的项目实践,感兴趣的可以了解一下
    2024-03-03
  • Java 坐标系相互转换方式

    Java 坐标系相互转换方式

    这篇文章主要介绍了Java中的坐标系相互转换方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • 解决java web应用线上系统偶发宕机的情况

    解决java web应用线上系统偶发宕机的情况

    这篇文章主要介绍了解决java web应用线上系统偶发宕机的情况,具有好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • java数据结构排序算法之归并排序详解

    java数据结构排序算法之归并排序详解

    这篇文章主要介绍了java数据结构排序算法之归并排序,结合具体实例形式详细分析了归并排序的原理、实现技巧与相关注意事项,需要的朋友可以参考下
    2017-05-05
  • windows下 jdk1.7安装教程图解

    windows下 jdk1.7安装教程图解

    java编程的初学者在开始编码前都会遇到一个难题,那就是jdk1.7环境变量配置怎么操作,怎么安装,针对这个难题,小编特地为大家整理相关教程,不了解的朋友可以前往查看使用
    2018-05-05
  • SpringBoot读取配置文件的五种方法总结

    SpringBoot读取配置文件的五种方法总结

    这篇文章主要为大家详细介绍了SpringBoot读取配置文件的五种方法,文中的示例代码讲解详细,对我们学习SpringBoot有一定帮助,需要的可以参考一下
    2022-08-08

最新评论