一、定义

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

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

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

二、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. 《C# 7.0核心技术指南》到货

    前几天有大佬推荐本书,并且折扣相当的划算,随入手一本.

  2. idea打包报错

    There is insufficient memory for the Java Runtime Environment to continue.# Native memory allocation ...

  3. DBUtils框架的使用(下)

    刚才讲了使用QueryRunner插入.修改.更新数据,现在来学习一下使用QueryRunner进行数据库表查询. 通过QueryRunner类的query()方法即可完成数据库表的查询操作,但是在查 ...

  4. 分享各大CMS采集资源站网址合集

    分享各大CMS采集资源站网址合集 http://www.172zy.xyz/ 172云资源 http://www.dbzyz.com/ 豆瓣云资源 http://www.gaoqingzy.com/ ...

  5. 单元测试之NUnit三

    NUnit 分三篇文章介绍,入门者可阅读文章,有基础者直接参考官方文档.初次写博客,望大家指点. 导航: 单元测试之NUnit一 单元测试之NUnit二 单元测试之NUnit三 除了Assert断言外 ...

  6. python 23 继承

    目录 继承--inheritance 1. 面向对象继承: 2. 单继承 2.1 类名执行父类的属性.方法 2.2 子类对象执行父类的属性.方法 2.3 执行顺序 2.4 既要执行子类的方法,又要执行 ...

  7. 设计模式(C#)——11代理模式

    推荐阅读:  我的CSDN  我的博客园  QQ群:704621321 前言        在软件开发过程中,当无法直接访问某个对象或访问某个对象存在困难时,我们希望可以通过一个中介来间接访问,这就是 ...

  8. JVM内存分配及String常用方法

    一,JVM内存分配和常量池 ​ 在介绍String类之前,先来简单分析一下在JVM中,对内存的使用是如何进行分配的.如下图所示(注意:在jdk1.8之后便没有方法区了): ​ ​ 如上JVM将内存分为 ...

  9. JWT原理 使用(入门篇)

    1.JWT简介 JWT:Json Web Token,是基于Json的一个公开规范,这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息,他的两大使用场景是:认证和数据交换 使用起来就是,由 ...

  10. 微信小程序室内地图导航开发-微信小程序JS加载esmap地图

    一.在微信小程序里显示室内三维地图 需要满足的两个条件 调用ESMap室内地图需要用到小程序web-view组件,想要通过 web-view 调用ESMap室内地图需要满足以下 2 个条件: 1. 小 ...