在阎宏博士的《JAVA与模式》一书中开头是这样描述责任链(Chain of Responsibility)模式的:

  责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。


在以下条件下可考虑使用Chain of Responsibility:
1 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
2 你想在不明确指定接受者的情况下,想过个对象中的一个提交一个请求。
3 可处理一个请求的对象集合应该被动态指定。


一个简单的例子:

  1. abstract class Handler {
  2.  
  3. private Handler nextHandler;
  4.  
  5. public Handler getNextHandler() {
  6. return nextHandler;
  7. }
  8.  
  9. public void setNextHandler(Handler nextHandler) {
  10. this.nextHandler = nextHandler;
  11. }
  12.  
  13. public abstract void doHandler();
  14.  
  15. }
  16.  
  17. class ConcreteHandler extends Handler {
  18.  
  19. @Override
  20. public void doHandler() {
  21.  
  22. if (getNextHandler() != null) {
  23.  
  24. System.out.println("还有责任链");
  25. getNextHandler().doHandler();
  26. } else {
  27.  
  28. System.out.println("我自己处理" + toString());
  29. }
  30.  
  31. }
  32. }

既然为设计模式,必然有其鲜明代码的主体框架,我们来分析下

首先定义一个抽象的处理角色Handler ,其次是具体实现类ConcreteHandler ,在ConcreteHandler 我们通过getNextHandler()来判断是否还有下一个责任链,如果有,则继续

传递下去,调用getNextHandler().doHandler()来实现。

分析了简单的责任链模式的代码框架之后,我们接下来给代码加点实际的功能,举个很简单的例子,就是报销流程,项目经理<部门经理<总经理

其中项目经理报销额度不能大于500,则部门经理的报销额度是不大于1000,超过1000则需要总经理审核

  1. abstract class ConsumeHandler {
  2.  
  3. private ConsumeHandler nextHandler;
  4.  
  5. public ConsumeHandler getNextHandler() {
  6. return nextHandler;
  7. }
  8.  
  9. public void setNextHandler(ConsumeHandler nextHandler) {
  10. this.nextHandler = nextHandler;
  11. }
  12.  
  13. /** user申请人 free报销费用 */
  14. public abstract void doHandler(String user, double free);
  15.  
  16. }
  17. //项目经理
  18. class ProjectHandler extends ConsumeHandler {
  19.  
  20. @Override
  21. public void doHandler(String user, double free) {
  22. if (free < 500) {
  23.  
  24. if (user.equals("lwx")) {
  25. System.out.println("给予报销:" + free);
  26. } else {
  27. System.out.println("报销不通过");
  28. }
  29.  
  30. } else {
  31. if (getNextHandler() != null) {
  32.  
  33. getNextHandler().doHandler(user, free);
  34. }
  35. }
  36.  
  37. }
  38. }
  39. //部门经理
  40. class DeptHandler extends ConsumeHandler {
  41.  
  42. @Override
  43. public void doHandler(String user, double free) {
  44. if (free < 1000) {
  45.  
  46. if (user.equals("zy")) {
  47. System.out.println("给予报销:" + free);
  48. } else {
  49. System.out.println("报销不通过");
  50. }
  51.  
  52. } else {
  53. if (getNextHandler() != null) {
  54.  
  55. getNextHandler().doHandler(user, free);
  56. }
  57. }
  58.  
  59. }
  60. }
  61. //总经理
  62. class GeneralHandler extends ConsumeHandler {
  63.  
  64. @Override
  65. public void doHandler(String user, double free) {
  66. if (free >=1000) {
  67.  
  68. if (user.equals("lwxzy")) {
  69. System.out.println("给予报销:" + free);
  70. } else {
  71. System.out.println("报销不通过");
  72. }
  73.  
  74. } else {
  75. if (getNextHandler() != null) {
  76.  
  77. getNextHandler().doHandler(user, free);
  78. }
  79. }
  80.  
  81. }
  82. }

测试下

  1. public static void main(String[] args) {
  2.  
  3. /*ConcreteHandler handler1 = new ConcreteHandler();
  4. ConcreteHandler handler2 = new ConcreteHandler();
  5. handler1.setNextHandler(handler2);
  6. handler1.doHandler();*/
  7.  
  8. ProjectHandler projectHandler =new ProjectHandler();
  9. DeptHandler deptHandler =new DeptHandler();
  10. GeneralHandler generalHandler =new GeneralHandler();
  11. projectHandler.setNextHandler(deptHandler);
  12. deptHandler.setNextHandler(generalHandler);
  13. projectHandler.doHandler("lwx", 450);
  14. projectHandler.doHandler("lwx", 600);
  15. projectHandler.doHandler("zy", 600);
  16. projectHandler.doHandler("zy", 1500);
  17. projectHandler.doHandler("lwxzy", 1500);
  18. }

执行结果

给予报销:450.0
报销不通过
给予报销:600.0
报销不通过
给予报销:1500.0

拓展联想:模拟实现servlet过滤器中字符和登陆过滤器的实现

关于tomcat中责任链的使用:http://www.cnblogs.com/java-my-life/archive/2012/05/28/2516865.html

《java设计模式》之责任链模式的更多相关文章

  1. Java设计模式十九——责任链模式

    责任链模式 老李的苦恼 每个人在出生的时候,都早已在暗中被标好了三六九等. 老李是一名建筑工地的木匠,和大多数生活在社会最底层的农民工一样,一辈子老实本分,胆小怕事.在他们的心中,谁当老爷都没有区别, ...

  2. 设计模式之jdk动态代理模式、责任链模式-java实现

    设计模式之JDK动态代理模式.责任链模式 需求场景 当我们的代码中的类随着业务量的增大而不断增大仿佛没有尽头时,我们可以考虑使用动态代理设计模式,代理类的代码量被固定下来,不会随着业务量的增大而增大. ...

  3. Python的组合模式与责任链模式编程示例

    Python的组合模式与责任链模式编程示例 这篇文章主要介绍了Python的组合模式与责任链模式编程示例,组合模式与责任链模式都属于Python的设计模式,需要的朋友可以参考下 组合模式 我们把Com ...

  4. Delphi 设计模式:《HeadFirst设计模式》---行为模式之责任链模式

    模式解说 责任链模式是一种对象的行为模式,它将处理客户端请求的那些对象联成一条链,并沿着这条链传递请求,直到有一个对象处理它为止. 通常使用在以下场合 1 有多个对象可以处理一个请求,哪个对象处理该请 ...

  5. Java设计模式系列之责任链模式

    责任链模式 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道 ...

  6. Java常见设计模式之责任链模式

    原文地址:  http://www.cnblogs.com/java-my-life/archive/2012/05/28/2516865.html 在阎宏博士的<JAVA与模式>一书中开 ...

  7. 《JAVA设计模式》之责任链模式(Chain of Responsibility)

    在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...

  8. 重学 Java 设计模式:实战责任链模式「模拟618电商大促期间,项目上线流程多级负责人审批场景」

    作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 场地和场景的重要性 射击

  9. Java设计模式学习记录-责任链模式

    前言 已经把五个创建型设计模式和七个结构型设计模式介绍完了,从这篇开始要介绍行为型设计模式了,第一个要介绍的行为型设计模式就是责任链模式(又称职责链模式). 责任链模式 概念介绍 责任链模式是为了避免 ...

随机推荐

  1. 最大熵,熵,MLE的解释,还行

    这篇文章: https://blog.csdn.net/jiaoyangwm/article/details/81276921

  2. Prototype 原型模式 复制 浅拷贝 clone MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  3. matlab中,怎样把矩阵中所有的0改为2

    一句话搞定:>> a(find(a==0))=[2]:把矩阵中所有的0改为2

  4. ArcGIS中的批量处理

    在实际生产过程中,经常遇到批量处理数据的情况.在ArcGIS中,除自己写代码来处理这类问题外,它提供了一个批量处理的工具,在ToolBox对应的工具上右键即可选择批处理工具. 和单个处理方式一样,输入 ...

  5. mac 终端 使用 solarized 主题设置语法高亮

    mac 终端 使用 solarized 主题设置语法高亮 先来看看 solarized 在 mac 终端上的效果图片 一:先下载 solarized 官网下载:https://github.com/a ...

  6. MemSQL学习笔记-类似MySQL的数据库

    http://gigaom.com/cloud/ex-facebookers-launch-memsql-to-make-your-database-fly/ -- 多主-从 http://www.m ...

  7. Openerp 7.0 附件存储位置

    我们知道对OpenERP中的每个内部对象(比如:业务伙伴,采购订单,销售订单,发货单,等等)我们都可以添加任意的附件,如图片,文档,视频等.那么这些附件在OpenERP内部是如何管理的呢? 默认情况下 ...

  8. org.dom4j.DocumentException:对实体 "virtual_card_id" 的引用必须以 ';' 分隔符结尾

      Error on line 1 of document  : 对实体 "virtual_card_id" 的引用必须以 ';' 分隔符结尾. CreateTime--2018年 ...

  9. 对opencv MeanShift 融合矩形框的改进

    OPENCV 中的代码改进.当然要依据自己的实际情况来,OPENCV 中行人检測有两种矩形框的融合算法.这里仅仅对meanshift 方法做改进 假设有更好的方法.希望能够跟我讲下. 对于去除重合部分 ...

  10. 关于free使用注意

    1,free的指针应该是通过 malloc calloc realloc 申请过内存的. 2,free的带有指针元素的结构体时要注意释放结构体的元素指针. 3,对于指向同一块内存的两个或多个指针,如果 ...