一、定义

  职责链模式,就是将能够处理某类请求事件的一些处理类,类似链条的串联起来。请求在链条上处理的时候,并不知道具体是哪个处理类进行处理的。一定程度上实现了请求和处理的解耦。

  实际生活中的经典例子就是公司的报销流程,一般主管、经理、总经理都是不同的报销额度,当职员进行报销申请的时候,如果主管权限不足,会自动的再向上提交给经理,经理可以处理也可以再向上

  提交总经理。报销申请(请求事件)提交后,职员自己并不需要再关注谁能处理,只是关注到最后结果即可。

二、java代码示例

  示例中,就以简单的逐层报销为例子:

   申请请求类

 package com.cfang.chainTest;

 import lombok.Builder;
import lombok.Data; @Data
@Builder
public class ApplyFile { private String name;
private Integer money; }

  抽象处理类:

 package com.cfang.chainTest;

 import lombok.Data;
import lombok.NonNull; @Data
public abstract class HandleCls { protected HandleCls nextCls;
@NonNull
private String name; //处理节点名 public abstract void pro(ApplyFile applyFile);
}

  主管类(直接审批,负责接收和向上申请)

 package com.cfang.chainTest;

 public class ZhuGuan extends HandleCls{

     public ZhuGuan(String name) {
super(name);
}
@Override
public void pro(ApplyFile applyFile) {
if(applyFile.getMoney() < 100) {
System.out.println(this.getName() + "处理了申请:" + applyFile.toString());
}else {
this.nextCls.pro(applyFile);
}
} }

  经理类:

 package com.cfang.chainTest;

 public class JingLi extends HandleCls{

     public JingLi(String name) {
super(name);
}
@Override
public void pro(ApplyFile applyFile) {
if(applyFile.getMoney() < 200) {
System.out.println(this.getName() + "处理了申请:" + applyFile.toString());
}else {
this.nextCls.pro(applyFile);
}
} }

  总经理类:

 package com.cfang.chainTest;

 public class ZoneJingLi extends HandleCls{

     public ZoneJingLi(String name) {
super(name);
}
@Override
public void pro(ApplyFile applyFile) {
if(applyFile.getMoney() < 300) {
System.out.println(this.getName() + "处理了申请:" + applyFile.toString());
}else {
this.nextCls.pro(applyFile);
}
} }

  测试类:审批流程链条是自己进行设置的,供使用者进行调用。

 package com.cfang.chainTest;

 public class TestMain {

     public static void main(String[] args) {
//创建职责链条
HandleCls p1 = new ZhuGuan("主管");
HandleCls p2 = new JingLi("经理");
HandleCls p3 = new ZoneJingLi("总经理");
p1.setNextCls(p2);
p2.setNextCls(p3); //创建报销申请
ApplyFile applyFile = ApplyFile.builder().name("猪小屁").money(99).build();
p1.pro(applyFile); applyFile = ApplyFile.builder().name("猪小屁").money(101).build();
p1.pro(applyFile); applyFile = ApplyFile.builder().name("猪小屁").money(201).build();
p1.pro(applyFile);
}
}

  输出:

主管处理了申请:ApplyFile(name=猪小屁, money=99)
经理处理了申请:ApplyFile(name=猪小屁, money=101)
总经理处理了申请:ApplyFile(name=猪小屁, money=201)

三、实际应用场景

  java类加载机制、servlet filter过滤器链、mybatis的plugin机制。。。

四、总结

  优点:

  1、请求对象不需要具体知道哪个类去处理,只需要关注最后处理结果即可。

  2、新增一个处理类的时候,无需修改原有代码,只需要维护处理器链即可

  缺点:

  1、调用的时候,不明确一定能处理,可能会出现到最后都没处理(一般可以设计个兜底服务)

  2、建立链条的时候,如果设置不当,可能形成循环调用。

Java职责链模式的更多相关文章

  1. 设计模式之职责链模式(JAVA实现)

    学习netty框架时,看到有人说netty用到了设计模式的职责链模式,学习一下职责链模式,主要参考大话设计模式. 主要场景: 小菜想要加薪,向经理提出加薪请求,经理没有权限,经理交由总监处理,总监也没 ...

  2. JAVA 设计模式 职责链模式

    用途 职责链模式 (Chain Of Responsibility) 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系. 将这个对象连成一条链,并沿着这条链传递该请求,直到有一个 ...

  3. OOP设计模式[JAVA]——03职责链模式

    职责链模式 Responsibility of Chain 在职责链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求 ...

  4. Java设计模式之《职责链模式》及应用场景

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6530089.html 职责链模式(称责任链模式)将请求的处理对象像一条长链一般组合起来,形 ...

  5. 职责链模式(Chain of Responsibility)的Java实现

    职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它 ...

  6. java设计模式-----18、职责链模式

    概念: Chain of Responsibility(CoR)模式也叫职责链模式.责任链模式或者职责连锁模式,是行为模式之一,该模式构造一系列分别担当不同的职责的类的对象来共同完成一个任务,这些类的 ...

  7. 设计模式之第13章-职责链模式(Java实现)

    设计模式之第13章-职责链模式(Java实现) “请假都那么麻烦,至于么.”“咋的了?”“这不快过年了么,所以我想早两天回去,准备一下,买买东西什么的,然后去给项目经理请假,但是他说快过年了,所以这个 ...

  8. Java设计模式之责任链模式、职责链模式

    本文继续介绍23种设计模式系列之职责链模式.   什么是链 1.链是一系列节点的集合. 2..链的各节点可灵活拆分再重组.   职责链模式 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间 ...

  9. Java设计模式(二十一):职责链模式

    职责链模式(Chain Of Responsibility Pattern) 职责链模式(Chain Of Responsibility Pattern):属于对象的行为模式.使多个对象都有机会处理请 ...

随机推荐

  1. Java进程故障排查

    故障分析 # 导致系统不可用情况(频率较大): 1)代码中某个位置读取数据量较大,导致系统内存耗尽,进而出现Full GC次数过多,系统缓慢: 2)代码中有比较消耗CPU的操作,导致CPU过高,系统运 ...

  2. javascript导出csv文件(excel)

    这里贴出JavaScript导出csv文件(excel)的代码. /** * 导出excel * @param {Object} title 标题列key-val * @param {Object} ...

  3. 利用递归,反射,注解等,手写Spring Ioc和Di 底层(分分钟喷倒面试官)了解一下

    再我们现在项目中Spring框架是目前各大公司必不可少的技术,而大家都知道去怎么使用Spring ,但是有很多人都不知道SpringIoc底层是如何工作的,而一个开发人员知道他的源码,底层工作原理,对 ...

  4. pycharm使用教程

    https://www.cnblogs.com/tsingke/p/7392800.html

  5. JMeter 登录,获取token的接口测试401

    项目组突然闲下来了,慌,所以给自己找点事情做,就在看测试的工具,fiddle,Postman,JMeter,发现前面两个好像差不太多,JMeter可以用于压力测试,就下了个JMeter开始测本地项目的 ...

  6. C#代码实现IoC(控制反转)设计,以及我对IoC的理解

    一. 什么是IoC 当在A类中要使用B类的时候,我们一般都是采用new的方式来实例化B类,这样一来这两个类就有很强的依赖关系,不符合低耦合的设计思想.这时候我们可以通过一个中间容器来实例化对象,需要的 ...

  7. 简易数据分析 11 | Web Scraper 抓取表格数据

    这是简易数据分析系列的第 11 篇文章. 今天我们讲讲如何抓取网页表格里的数据.首先我们分析一下,网页里的经典表格是怎么构成的. First Name 所在的行比较特殊,是一个表格的表头,表示信息分类 ...

  8. Python之变量的创建过程

    Python之变量的创建过程 一.变量创建过程 首先,当我们定义了一个变量name = 'Kwan'的时候,在内存中其实是做了这样一件事: 程序开辟了一块内存空间,将'Kwan'存储进去,再让变量名n ...

  9. 良许 | 网络检测神器 ss 命令,你可能根本就不会用!

    今天我们来介绍一下 Linux ss 命令. ss 是 Socket Statistics 的缩写,用来统计 socket 连接的相关信息,它跟 netstat 差不多,但有着比 netstat 更强 ...

  10. 如果使用tf::transform进行简单的不同frame间的pose转换

    tf转换,分为两部分:broadcaster和listener.前者是tf的发布者,后者是接收者.我们如果要建立一个完整的tf体系,需要自己先生成tf信息用broadcaster发布出去,然后再在需要 ...