//一个请假请求
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. SpringMVC笔记(3)

    一.SpringMVC 拦截器 1.1 快速入门 步骤 创建拦截器类实现HandlerInterceptor接口 public class MyInterceptor01 implements Han ...

  2. C++之常指针,指针常量,函数指针,const用法总结

    1.const char *p,char const *p,char * const p 对于C++而言,没有const * 修饰符,所以,const只可以修饰类型或者变量名.因而const char ...

  3. Android中TextView和EditView常用属性设置

    Android中TextView和EditView常用属性设置 点击跳转

  4. K8S资源编排(yaml)

    1.yaml的格式 2.yaml的组成部分 3.yaml常用字段的含义 4.yaml编写方式 (1)方式一:使用kubectl create命令生成yaml文件,然后修改 (2)方式2:在已经部署好的 ...

  5. 2021.9.12周六PAT甲级考试复盘与总结

    周六PAT甲级考试复盘与总结 先说结论:仍未步入"高手"行列:现在的学习节奏与方法是对的,有十万分的必要坚持下去. 题目 知识点 分数 T1 前缀和.二分 11 / 20 T2 排 ...

  6. openswan协商流程之(六):main_inI3_outR3()

    主模式第六包:main_inI3_outR3 1. 序言 main_inI3_outR3()函数是ISAKMP协商过程中第六包的核心处理函数的入口,第五六包主要用来验证对方的身份信息,同时此报文也是加 ...

  7. Linux内核下包过滤框架——iptables&netfilter

    iptables & netfilter 1.简介 netfilter/iptables(下文中简称为iptables)组成Linux内核下的包过滤防火墙,完成封包过滤.封包重定向和网络地址转 ...

  8. 为什么要设置GOROOT/GOPATH

    设置GOROOT的原因 编译器的位置指定的时候,需要指定GO开发包的安装位置,然后设置环境变量PATH的时候,需要指定到安装包下的bin目录,其中就有以下的编译/执行器.所以GOROOT指定了前面的路 ...

  9. pibbtimq高级使用技术,双向通信

    本案例目是是服务端发送客户端,客户端收到反应给服务端,双向通信客户端代码如下:import pikaimport timeconnection = pika.BlockingConnection(pi ...

  10. js根据日期获取所在周

    一.获取时间所在周的周一.周五 function getFirstLastDay (time) { let date = new Date(time) let Time = date.getTime( ...