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

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


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


一个简单的例子:

 abstract class Handler {

     private Handler nextHandler;

     public Handler getNextHandler() {
return nextHandler;
} public void setNextHandler(Handler nextHandler) {
this.nextHandler = nextHandler;
} public abstract void doHandler(); } class ConcreteHandler extends Handler { @Override
public void doHandler() { if (getNextHandler() != null) { System.out.println("还有责任链");
getNextHandler().doHandler();
} else { System.out.println("我自己处理" + toString());
} }
}

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

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

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

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

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

 abstract class ConsumeHandler {

     private ConsumeHandler nextHandler;

     public ConsumeHandler getNextHandler() {
return nextHandler;
} public void setNextHandler(ConsumeHandler nextHandler) {
this.nextHandler = nextHandler;
} /** user申请人 free报销费用 */
public abstract void doHandler(String user, double free); }
//项目经理
class ProjectHandler extends ConsumeHandler { @Override
public void doHandler(String user, double free) {
if (free < 500) { if (user.equals("lwx")) {
System.out.println("给予报销:" + free);
} else {
System.out.println("报销不通过");
} } else {
if (getNextHandler() != null) { getNextHandler().doHandler(user, free);
}
} }
}
//部门经理
class DeptHandler extends ConsumeHandler { @Override
public void doHandler(String user, double free) {
if (free < 1000) { if (user.equals("zy")) {
System.out.println("给予报销:" + free);
} else {
System.out.println("报销不通过");
} } else {
if (getNextHandler() != null) { getNextHandler().doHandler(user, free);
}
} }
}
//总经理
class GeneralHandler extends ConsumeHandler { @Override
public void doHandler(String user, double free) {
if (free >=1000) { if (user.equals("lwxzy")) {
System.out.println("给予报销:" + free);
} else {
System.out.println("报销不通过");
} } else {
if (getNextHandler() != null) { getNextHandler().doHandler(user, free);
}
} }
}

测试下

 public static void main(String[] args) {

         /*ConcreteHandler handler1 = new ConcreteHandler();
ConcreteHandler handler2 = new ConcreteHandler();
handler1.setNextHandler(handler2);
handler1.doHandler();*/ ProjectHandler projectHandler =new ProjectHandler();
DeptHandler deptHandler =new DeptHandler();
GeneralHandler generalHandler =new GeneralHandler();
projectHandler.setNextHandler(deptHandler);
deptHandler.setNextHandler(generalHandler);
projectHandler.doHandler("lwx", 450);
projectHandler.doHandler("lwx", 600);
projectHandler.doHandler("zy", 600);
projectHandler.doHandler("zy", 1500);
projectHandler.doHandler("lwxzy", 1500);
}

执行结果

给予报销: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. Reverse Nodes in k-Group leetcode java

    题目: Given a linked list, reverse the nodes of a linked list k at a time and return its modified list ...

  2. 【华为OJ平台练习题】求最大公共子串的个数和元素

    1.原题是求出最大公共子串的个数就可以 原理:利用二维矩阵排列的方式.将俩字符串进行比較 #include <iostream> #include <vector> using ...

  3. matlab中help所有函数功能的英文翻译

    doc funname 在帮助浏览器中打开帮助文档 help funname 在命令窗口打开帮助文档 helpbrowser 直接打开帮助浏览器 lookfor funname 搜索某个关键字相关函数 ...

  4. CheeseZH: Stanford University: Machine Learning Ex3: Multiclass Logistic Regression and Neural Network Prediction

    Handwritten digits recognition (0-9) Multi-class Logistic Regression 1. Vectorizing Logistic Regress ...

  5. Linux下时间格式转换及获取方法

    Linux下使用clock_gettime给程序计时 #include <stdio.h> #include <unistd.h> #include <stdlib.h& ...

  6. [置顶] 【玩转cocos2d-x之二十】从CCObject看cocos2d-x的内存管理机制

    原创作品,转载请标明:http://blog.csdn.net/jackystudio/article/details/13765639 再看CCObject,剔除上节的拷贝相关,以及Lua脚本相关的 ...

  7. 知识共享图文直播---(一)将数据库中的数据加载到MSFlexGrid空间中再导入Excel

    熟话说万物皆有其存在的道理,为什么我突然想写<知识共享图文直播>这个系列呢?首先,我想的是记录自己学习的历程,在记录中加深自己对知识的理解,同时也希望自己的博文能帮助到其他数据库的初学者. ...

  8. 算法笔记_178:历届试题 邮局(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 C村住着n户村民,由于交通闭塞,C村的村民只能通过信件与外界交流.为了方便村民们发信,C村打算在C村建设k个邮局,这样每户村民可以去离自己 ...

  9. 1z0-052 q209_8

    8: Note the following structures in your database server: 1. Extents 2. OS Blocks 3. Tablespace 4. S ...

  10. nginx 备忘

    下载 start nginxlocalhost:80