在阎宏博士的《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. rotate-function

    https://leetcode.com/problems/rotate-function/ public class Solution { public int maxRotateFunction( ...

  2. 在CentOS/RHEL上设置SSH免密码登录

    本文会告诉你怎样在 CentOS/RHEL 上设置 SSH 免密码登录.自动登录配置好以后,你可以通过它使用 SSH (Secure Shell)和安全复制 (SCP)来移动文件. SSH 是开源的, ...

  3. (LeetCode 78)SubSets

    Given a set of distinct integers, S, return all possible subsets. Note: Elements in a subset must be ...

  4. Python访问MySQL数据库

    #encoding: utf-8 import mysql.connector __author__ = 'Administrator' config={'host':'127.0.0.1',#默认1 ...

  5. shell综合

    既可恶又不得不注意的地方: 1.if 与[ 之间必须有空格, 2.[ ]与判断条件之间也必须有空格, 3.]与; 之间不能有空格, 4.变量赋值的时候,等号两边不能有空格, 调试:sh -x xxx. ...

  6. angular5使用httpclient时解决跨域问题

    跨域问题的环境: 在本地开发时,使用命令行ng s开启服务,访问地址为http://localhost:4200 假设调用数据接口的服务地址为http://localhost:8088/api/dat ...

  7. MVC 之 属性详解

    一.System [AttributeUsage]:指定另一特性类的用法.无法继承此类. [CLSCompliant]:指示程序元素是否符合公共语言规范 (CLS).无法继承此类. [ContextS ...

  8. GraphQL返回分页对象

    private GraphQLOutputType testUserOutputType; private GraphQLOutputType pageType; private void initO ...

  9. Linux 下升级python和安装pip

    Linux版本升级: 1.  首先确认Linux操作系统中自带的python 版本时候与自己所需要的版本一致 所有的python版本都在https://www.python.org/ftp/pytho ...

  10. 使用 Scrapy 构建一个网络爬虫

    来自weixin 记得n年前项目需要一个灵活的爬虫工具,就组织了一个小团队用Java实现了一个爬虫框架,可以根据目标网站的结构.地址和需要的内容,做简单的配置开发,即可实现特定网站的爬虫功能.因为要考 ...