//一个请假请求
public class LeaveRequest {
private int leaveDays; private String name; public void leave(){
System.out.println("走完了流程都没人处理我");
} //省略getter、setter
}
//一个请假的处理接口,具体的处理类都要实现这个接口
@FunctionalInterface
public interface LeaveHandler {
// 直属主管审批处理的请假天数
int MIN = 3; // 部门经理需要处理的请假天数
int MIDDLE = 10; // 总经理审批
int MAX = 30; void handRequest(LeaveRequest leaveRequest, FilterChain filterChain);
}
//直属主管处理类
public class SupervisorHandler implements LeaveHandler{ @Override
public void handRequest(LeaveRequest leaveRequest, FilterChain filterChain) {
if (leaveRequest.getLeaveDays() < MIN){
System.out.println("请假天数" + leaveRequest.getLeaveDays() + "我是直属主管,我处理了");
return;
}
System.out.println("主管处理不了,下一个");
filterChain.doFilter();
}
} //部门经理处理类
public class DeptManagerHandler implements LeaveHandler{ @Override
public void handRequest(LeaveRequest leaveRequest, FilterChain filterChain) {
if (leaveRequest.getLeaveDays() <= MIDDLE){
System.out.println("请假天数" + leaveRequest.getLeaveDays() + "我是部门经理,我处理了");
return;
}
System.out.println("经理处理不了,下一个");
filterChain.doFilter();
}
} //总经理处理类
public class GeneralManagerHandler implements LeaveHandler{ @Override
public void handRequest(LeaveRequest leaveRequest, FilterChain filterChain) {
if (leaveRequest.getLeaveDays() <= MAX){
System.out.println("请假天数" + leaveRequest.getLeaveDays() + "我是总经理,我处理了");
return;
}
System.out.println("总经理处理不了,下一个");
filterChain.doFilter();
}
}
//过滤器链,把各个处理类串联起来
public class FilterChain {
private int index = 0; private LeaveRequest leaveRequest; private List<LeaveHandler> leaveHandlerList = new ArrayList<LeaveHandler>(); public FilterChain(LeaveRequest leaveRequest){
this.leaveRequest = leaveRequest;
} public FilterChain addHandler(LeaveHandler leaveHandler){
if (null == leaveHandler) return null;
this.leaveHandlerList.add(leaveHandler);
return this;
} public void doFilter(){
if(index == leaveHandlerList.size()) {
leaveRequest.leave();
return;
}
     
leaveHandlerList.get(index++).handRequest(leaveRequest,this);
}
}
public class Main {
public static void main(String[] args){
LeaveRequest leaveRequest = new LeaveRequest(49,"小明"); FilterChain filterChain = new FilterChain(leaveRequest); filterChain.addHandler(new SupervisorHandler())
.addHandler(new DeptManagerHandler())
.addHandler(new GeneralManagerHandler())
//使用lambda表达式创建自定义处理类
.addHandler((LeaveRequest request, FilterChain filter) -> {
if (request.getLeaveDays() <= 50){
System.out.println("请假天数" + request.getLeaveDays() + "我是自定义处理器,我处理了");
return;
}
System.out.println("自定义处理不了,下一个");
filter.doFilter();
})
.doFilter();
}
}
输出:
主管处理不了,下一个
经理处理不了,下一个
总经理处理不了,下一个
请假天数49我是自定义处理器,我处理了

java实现责任链模式的小demo的更多相关文章

  1. 【设计模式】Java设计模式 - 责任链模式

    [设计模式]Java设计模式 - 责任链模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 目录 [设计模式]Java设计模式 - 责 ...

  2. 我的Java设计模式-责任链模式

    今天来说说程序员小猿和产品就关于需求发生的故事.前不久,小猿收到了产品的需求. 产品经理:小猿,为了迎合大众屌丝用户的口味,我们要放一张图,要露点的. 小猿:......露点?你大爷的,让身为正义与纯 ...

  3. Java设计模式の责任链模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...

  4. Java设计模式-责任链模式

    提出问题: 最初接触责任链模式就是在struts2中,在当时学的时候看了一眼,大概知道了原理,最近在复习,模拟struts2,说是模拟只是大体模拟了struts2的工作流程,很多东西都是写死的,只是为 ...

  5. Java实现责任链模式

    责任链模式: 将接受者对象连成一条链,并在该链上传递请求,直到一个几首这对象处理它.通过让更多对象有机会处理请求,避免了请求发送者和接受者之间的耦合. 责任链模式的优缺点: 优点:高内聚,低耦合.业务 ...

  6. java 设计模式 -- 责任链模式

    设计模式 – 责任链模式 介绍: 责任链模式是一种动态行为模式,有多个对象,每一个对象分别拥有其下家的引用.连起来形成一条链.待处理对象则传到此链上,在此链进行传递,且待处理对象并不知道此会被链上的哪 ...

  7. Java设计模式-责任链模式(Chain of Responsibility)

    接下来我们将要谈谈责任链模式,有多个对象,每个对象持有对下一个对象的引用,这样就会形成一条链,请求在这条链上传递,直到某一对象决定处理该请求.但是发出者并不清楚到底最终那个对象会处理该请求,所以,责任 ...

  8. Java设计模式—责任链模式

    责任链模式的定义: 使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止. 责任链模式的重点是在"链& ...

  9. java设计模式解析(11) Chain责任链模式

    设计模式系列文章 java设计模式解析(1) Observer观察者模式 java设计模式解析(2) Proxy代理模式 java设计模式解析(3) Factory工厂模式 java设计模式解析(4) ...

随机推荐

  1. 笔记:如何使用postgresql做顺序扣减库存

    如何使用postgresql做顺序扣减库存 Ⅰ.废话在前面 首先这篇笔记源自于最近的一次需求,这个临时性需求是根据两份数据(库存数据以及出库数据) 算出实际库存给到业务,至于库存为什么不等于剩余库存, ...

  2. FPGA nios软核编写液晶屏LCD12864驱动程序源码以及注意事项,本人亲自踩坑,重要!!!

    LCD12864引脚如下: FPGA开发板得提供,3.3v电压,5v电压,普通io都是3.3v电压 DB:数据脚,得用双向io,因为程序里面需要读取液晶的应答(普通io3.3v可以) E:?输出引脚即 ...

  3. WEB漏洞——SQL

    由于我的博客是学到渗透的时候才做的,没有关于WEB漏洞的笔记,现在发现WEB层面的漏洞有些不太熟悉了,边写一下笔记边复习一下,就从sql注入开始吧 话不多说先上大佬写的表[ctfhub]SQL注入 - ...

  4. 离线安装Windows Terminal

    Windows Terminal颜值高.适配好.速度快,是Windows 10下命令行工具的不二选择. 最近在公司电脑上安装Windows Terminal时遇到一个问题,由于公司电脑不能直接连接外网 ...

  5. Git:git commit时退出报错解决(Error45、Error325)

    Git 报错 在输入git commit编辑注释日志时强制退出git程式,文件会变成只读文件,于是出现下述报错: 解决方法(ERROR45) 我们提交代码的正常操作流程一般是: 输入git commi ...

  6. JVM-调优-命令

    目录 jps 命令格式 option参数 示例 jstat 命令格式 参数 option 参数总览 option 参数详解 -class -compiler -gc -gccapacity -gcut ...

  7. 分享一则Linux系统邮件提示 /usr/local/lib/libprocesshider.so > /etc/ld.so.preload 的中病毒解决方法

    ​ 系统环境:CentOS Linux release 7.6.1810 (AltArch)                   CPU架构:ARM            最近发现生产服务器CPU占用 ...

  8. 清除router路由后面的参数

    清除router参数: 1.this.$router.push({ query: {}}) 2.var path = this.$route.path; //获取路由路径    this.$route ...

  9. Nginx rewrite跳转 location匹配

    目录: 一.常用的Nginx 正则表达式 二.location 三.rewrite 一.常用的Nginx 正则表达式 1 ^ :匹配输入字符串的起始位置 2 $ :匹配输入字符串的结束位置 3 * : ...

  10. 解读Flex布局及其基本使用

    Flex布局的基本内容: felx布局意为"弹性布局",主要用于为盒状模型提供最大的灵活性.被广泛的应用于移动端,PC端的响应式布局. 首先:定义盒子为flex布局: .box{ ...