顾名思义,责任链模式(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。每个记录器消息的级别是否属于自己的级别,如果是则相应地打印出来,否则将不打印并把消息传给下一个记录器。

java责任链模式_java中责任链模式详解和使用方法相关推荐

  1. java list 移除_java 中List删除实例详解

    java 中List删除实例详解 1.循环删除List中的元素 public static void main(String[] args) { List t=new ArrayList(); for ...

  2. java object 源码_java中Object类 源代码详解

    packagejava.lang;public classObject {/*一个本地方法,具体是用C(C++)在DLL中实现的,然后通过JNI调用.*/ private static native ...

  3. java 正则判断小数_java判断是否是小数详解(正则方法)

    java使用正则判断是否小数的方法:(推荐:java视频教程)public static void main(String[] args) { Pattern p1 = Pattern.compile ...

  4. PHP开发中常见的安全问题详解和解决方法

    PHP开发中常见的安全问题详解和解决方法 参考文章: (1)PHP开发中常见的安全问题详解和解决方法 (2)https://www.cnblogs.com/walblog/articles/83313 ...

  5. java中匿名内部类详解_java 中匿名内部类的实例详解

    搜索热词 java 中匿名内部类的实例详解 原来的面貌: class TT extends Test{ void show() { System.out.println(s+"~~~哈哈&q ...

  6. java中throws用法_java中throws实例用法详解

    在程序出现异常时,会有一个抛出异常的throw出现,这里我们要跟今天所讲的throws区分开.throws的作用是声明抛出,在名称上也跟throw有所不同.下面我们就throws对策概念.语法.实例带 ...

  7. file java详解_Java中File的实例详解

    Java中File的实例详解 File 代表文件或者目录的类 构造函数 File(File parent,String child)---代表了指定父目录下的指定的子文件或者子目录 File(Stri ...

  8. java configuration类_JAVA中的Configuration类详解

    本文主要研究的是java中的configuration类的用法,涉及maven自动加载,pom.xml配置和简单的java代码,具体如下. properties文件是java平台默认的配置文件格式,其 ...

  9. java中final详解_Java中final用法与详解

    Java中final用法与详解 final作为Java中经常用到的关键字,了解final的使用方法是非常有必要的.这里从final关键字在数据域.方法和类中三个方面分析final关键字的主要用法. f ...

  10. java模板方法模式_Java中的模板方法模式

    java模板方法模式 模板方法模式是一种行为模式,建议在超类中更一般地定义算法. 该算法是在称为模板方法的方法中定义的. 子类仅定义更具体的算法步骤的实现. 使用这种设计模式的好处是,算法后面的任何更 ...

最新文章

  1. excel 按数据拆分 xlam_利用EXCEL提升效率之五分钟缩短至五秒批量合并EXCEL批量转换PDF批量上传报关单随附单据___EXCELVBA...
  2. 用python写脚本看什么书-终于知晓python编写脚本入门教程
  3. mysql的查询、子查询及连接查询
  4. android studio import android-source-code
  5. redhat mysql编译安装_RHEL6.2编译安装MySQL 5.6.16过程分享
  6. Eclipse之Android项目名有红感叹号的解决办法
  7. ftp上传文件夹_ftp同步软件哪个好,ftp同步软件哪个好,6款好用推荐
  8. JMeter源码集成到Eclipse
  9. 分页查询为什么会报数组越界错误_Java Note-数据结构(1)数组
  10. 正宗PC Unix实验环境
  11. 计算机组成知识试题及答案,2015年计算机考研:计算机组成原理试题六【附答案】...
  12. 无心插柳,再次浅谈.net资源的回收
  13. 苹果mac微软windows远程连接工具:microsoft remote desktop
  14. postgreSQL 自动递增序号
  15. Tensorflow的ckpt转为npy格式的代码
  16. HR:“最喜欢阿里出来的程序员了,技术又好又耐艹!” 我:???
  17. 【ROS进阶】常用函数——ros::ok(),ros::Rate,ros::spin()和ros::spinOnce()
  18. 深圳药厂洁净车间装修SICOLAB深圳药厂GMP洁净车间装修
  19. 如何防范SQL注入 SQL注入测试
  20. MDK 5.25 J-link V9 烧写程序失败

热门文章

  1. 日历 mac_如何在Mac上订阅日历
  2. 广州看房网:认购书中的定金可以退吗?
  3. 『ML笔记』字典学习3(Dictionary Learning,KSVD)
  4. IT新闻中的“景德镇”是什么意思?
  5. 重庆大学数字图像处理实验一二
  6. 斯坦福大学吴佳俊:通过自然监督编码理解视觉世界
  7. 缓存一致性MESI与内存屏障
  8. Android 高仿QQ 登陆界面
  9. 基于PHP房屋租赁管理系统设计与实现
  10. CSS margin 属性详解