Java职责链模式
一、定义
职责链模式,就是将能够处理某类请求事件的一些处理类,类似链条的串联起来。请求在链条上处理的时候,并不知道具体是哪个处理类进行处理的。一定程度上实现了请求和处理的解耦。
实际生活中的经典例子就是公司的报销流程,一般主管、经理、总经理都是不同的报销额度,当职员进行报销申请的时候,如果主管权限不足,会自动的再向上提交给经理,经理可以处理也可以再向上
提交总经理。报销申请(请求事件)提交后,职员自己并不需要再关注谁能处理,只是关注到最后结果即可。
二、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职责链模式的更多相关文章
- 设计模式之职责链模式(JAVA实现)
学习netty框架时,看到有人说netty用到了设计模式的职责链模式,学习一下职责链模式,主要参考大话设计模式. 主要场景: 小菜想要加薪,向经理提出加薪请求,经理没有权限,经理交由总监处理,总监也没 ...
- JAVA 设计模式 职责链模式
用途 职责链模式 (Chain Of Responsibility) 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系. 将这个对象连成一条链,并沿着这条链传递该请求,直到有一个 ...
- OOP设计模式[JAVA]——03职责链模式
职责链模式 Responsibility of Chain 在职责链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求 ...
- Java设计模式之《职责链模式》及应用场景
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6530089.html 职责链模式(称责任链模式)将请求的处理对象像一条长链一般组合起来,形 ...
- 职责链模式(Chain of Responsibility)的Java实现
职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它 ...
- java设计模式-----18、职责链模式
概念: Chain of Responsibility(CoR)模式也叫职责链模式.责任链模式或者职责连锁模式,是行为模式之一,该模式构造一系列分别担当不同的职责的类的对象来共同完成一个任务,这些类的 ...
- 设计模式之第13章-职责链模式(Java实现)
设计模式之第13章-职责链模式(Java实现) “请假都那么麻烦,至于么.”“咋的了?”“这不快过年了么,所以我想早两天回去,准备一下,买买东西什么的,然后去给项目经理请假,但是他说快过年了,所以这个 ...
- Java设计模式之责任链模式、职责链模式
本文继续介绍23种设计模式系列之职责链模式. 什么是链 1.链是一系列节点的集合. 2..链的各节点可灵活拆分再重组. 职责链模式 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间 ...
- Java设计模式(二十一):职责链模式
职责链模式(Chain Of Responsibility Pattern) 职责链模式(Chain Of Responsibility Pattern):属于对象的行为模式.使多个对象都有机会处理请 ...
随机推荐
- 更新!ArcMap和ArcGIS Pro加载百度影像地图
上一篇文章写了ArcMap和ArcGIS Pro中加载百度地图 的方法 一次没有把百度影像加载的功能开发出来,趁这几天有空整理了下 加载方法按照上次那篇文章操作. 百度影像wmts加载地址:http: ...
- 随笔编号-02 阿里云CentOS7系列三 -- 配置防火墙
前面讲到了安装JDK以及Tomcat.但是大家会发现,当我们访问 http:// XXX.XXX.XXX.XXX:8080/80 时候,tomcat 猫并没有出现.原因就是没有设置防火墙. 再次介绍下 ...
- jvm系列(七):如何优化Java GC「译」
本文由CrowHawk翻译,地址:如何优化Java GC「译」,是Java GC调优的经典佳作. Sangmin Lee发表在Cubrid上的”Become a Java GC Expert”系列文章 ...
- unity_UGUI养成之路02
1.技能的冷确效果 2.背包的分页效果 1创建背包的总面板,并添加ToggleGroup组件 2.物品面板的实现 3.背包分页的实现 注意:添加了Toggle组件的游戏对象不能再添加button组件. ...
- python decode encode 解码与编码问题
python 解码与编码问题 1.decode 俗称解码,把编码解码成unicode,例如一个字符串变量 str 是utf-8编码,使用str.decode('utf-8') ,就是把utf-8编码 ...
- Win10环境下安装压缩包版本MySQL-8.0.13
准备工作 系统环境:Windows 10 1803版本: 压缩包:MySQL-8.0.13 Windows zip包下载: 安装过程 1. 加载安装包到你的安装目录 将下载的MySQL压缩包解压并移到 ...
- Node开发知识概括
一. javascript高级话题(面向对象,作用域,闭包,设计模式等) 1. 常用js类定义的方法有哪些? 参考答案:主要有构造函数原型和对象创建两种方法.原型法是通用老方法,对象创建是ES5推荐使 ...
- D-Distance_2019牛客暑期多校训练营(第八场)
题目链接 Distance 题意 1<=nmh,q<=1e5 q个操作 1 x y z往坐标里加入一个点 2 x y z查询距离该点最近的点的距离(曼哈顿距离) 题解 做法一 将要插入的点 ...
- python 中的while循环、格式化、编码初始
while循环 循环:不断重复着某件事就是循环 while 关键字 死循环:while True: 循环体 while True: # 死循环# print("坚强")# pr ...
- 单细胞转录组测序数据的可变剪接(alternative splicing)分析方法总结
可变剪接(alternative splicing),在真核生物中是一种非常基本的生物学事件.即基因转录后,先产生初始RNA或称作RNA前体,然后再通过可变剪接方式,选择性的把不同的外显子进行重连,从 ...