java实现责任链模式的小demo
//一个请假请求
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的更多相关文章
- 【设计模式】Java设计模式 - 责任链模式
[设计模式]Java设计模式 - 责任链模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 目录 [设计模式]Java设计模式 - 责 ...
- 我的Java设计模式-责任链模式
今天来说说程序员小猿和产品就关于需求发生的故事.前不久,小猿收到了产品的需求. 产品经理:小猿,为了迎合大众屌丝用户的口味,我们要放一张图,要露点的. 小猿:......露点?你大爷的,让身为正义与纯 ...
- Java设计模式の责任链模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...
- Java设计模式-责任链模式
提出问题: 最初接触责任链模式就是在struts2中,在当时学的时候看了一眼,大概知道了原理,最近在复习,模拟struts2,说是模拟只是大体模拟了struts2的工作流程,很多东西都是写死的,只是为 ...
- Java实现责任链模式
责任链模式: 将接受者对象连成一条链,并在该链上传递请求,直到一个几首这对象处理它.通过让更多对象有机会处理请求,避免了请求发送者和接受者之间的耦合. 责任链模式的优缺点: 优点:高内聚,低耦合.业务 ...
- java 设计模式 -- 责任链模式
设计模式 – 责任链模式 介绍: 责任链模式是一种动态行为模式,有多个对象,每一个对象分别拥有其下家的引用.连起来形成一条链.待处理对象则传到此链上,在此链进行传递,且待处理对象并不知道此会被链上的哪 ...
- Java设计模式-责任链模式(Chain of Responsibility)
接下来我们将要谈谈责任链模式,有多个对象,每个对象持有对下一个对象的引用,这样就会形成一条链,请求在这条链上传递,直到某一对象决定处理该请求.但是发出者并不清楚到底最终那个对象会处理该请求,所以,责任 ...
- Java设计模式—责任链模式
责任链模式的定义: 使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止. 责任链模式的重点是在"链& ...
- java设计模式解析(11) Chain责任链模式
设计模式系列文章 java设计模式解析(1) Observer观察者模式 java设计模式解析(2) Proxy代理模式 java设计模式解析(3) Factory工厂模式 java设计模式解析(4) ...
随机推荐
- MySQL-基础-2
MySQL数据库介绍 • MySQL是一种开放源代码的关系型数据库管理系统(RDBMS),MySQL数据库系统使用最常用的数据库管理语言--结构化查询语言(SQL)进行数据库管理. • MySQL的历 ...
- elsa core—3.elsa 服务
在本快速入门中,我们将介绍一个用于设置Elsa Server的最小ASP.NET Core应用程序.我们还将安装一些更常用的activities(活动),如Timer.Cron和sendmail,以能 ...
- QT学习日记篇-02-QT信号和槽
课程大纲: <1>给控件改名字 随着UI界面的控件变多,如果使用系统自带的名称,后期会让人不明觉厉,说白了,就是掌握C++的命名规则:易懂,条例清晰,人性化 方法:直接点击控件,进入右侧对 ...
- Linux基础命令(基于CentOS7)
1.帮助相关命令 man 查看普通命令的帮助 --help 只能查看内置命令 info 查看一个命令的更多信息 type 查看是否为内置命令 2.关机重启 shutdown -h 关机 -r 重启 - ...
- Tricks
由于本人着实有些菜,因此在此积累一些巧妙的 \(Tricks\) ,以备不时之需... 与其说是 \(Tricks\) 不如说是学习笔记?? 数学 组合数 常见的数列 斐波那契数列 图论 树论 \(P ...
- CSP-J&S 2020挂分记
应该是退役记 OI 是一门玄学--考后有感 Day -inf 找各科老师请假备考,看着我倒一倒二的好成绩分纷劝我放弃竞赛,成功请到了假. Day -1 怎么莫名其妙大家都在学些奇怪的东西? 跟风写了一 ...
- Tars | 第7篇 TarsJava Subset最终代码的测试方案设计
目录 前言 1. SubsetConf配置项的结构 1.1 SubsetConf 1.2 RatioConfig 1.3 KeyConfig 1.4 KeyRoute 1.5 SubsetConf的结 ...
- Linux详细安装流程(直接看图)
准备工作:一台电脑.sentOS镜像文件. 一.首先打开虚拟机,点击文件--新建虚拟机 二.选择自定义,然后点击下一步
- FastJson之autotype bypass
FastJson之autotype bypass 在1.2.25版本之后,添加了checkAutoType方法.在方法中引入了白名单(AutoType).黑名单(denyList)和autoTypeS ...
- Vue中使用 iview 之-踩坑日记
导航列表: 一.iview单选框Select验证问题 二.iview表单v-if引起的问题 三.Upload 手动上传组件 使用是出现的问题 四.Tabs嵌套使用时的问题 五.Tooltip 换行问题 ...