//一个请假请求
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. Ajax重构

    Ajax重构简介 Ajax的实现主要依赖于XMLHttpRequest对象,但是在调用其进行异步数据传输时,由于XMLHttpRequest对象的实例在处理事件完成后就会被销毁,所以如果不对该对象进行 ...

  2. Redis集群的搭建及与SpringBoot的整合

    1.概述 之前聊了Redis的哨兵模式,哨兵模式解决了读的并发问题,也解决了Master节点单点的问题. 但随着系统越来越庞大,缓存的数据越来越多,服务器的内存容量又成了问题,需要水平扩容,此时哨兵模 ...

  3. Identity用户管理入门七(扩展用户字段)

    在实际使用时会发现很多字段在IdentityUser中并不存在,比如增加生日,地址等字段,可在模型类中实现自己的模型并继承自IdentityUser,需要修改的代码为以下类 一.新增模型 using ...

  4. FinallShell连接Centos虚拟机

    1.虚拟机下输入ip addr查看网络状态,保证ens33下有ip 2.若没有IP的解决办法 方法一················· 1.输入 cd /etc/sysconfig/network-s ...

  5. Dockerfile自动制作Docker镜像(二)—— 其它常用命令

    Dockerfile自动制作Docker镜像(二)-- 其它常用命令 前言 a. 本文主要为 Docker的视频教程 笔记. b. 环境为 CentOS 7.0 云服务器 c. 上一篇:Dockerf ...

  6. 制作nginx+php的docker镜像方法

    制作nginx+php的docker镜像方法一.准备安装的工具工具:docker-17.06.0-ce.nginx-1.13.2.PHP-5.5.38 .supervisor配置思路:1.安装dock ...

  7. FastAPI(7)- get 请求 - 详解 Path

    前言 上一篇讲了可以为查询参数添加额外的校验和元数据,Query 库:https://www.cnblogs.com/poloyy/p/15306809.html 这篇讲可以为路径查询添加额外的校验和 ...

  8. spark相关介绍-提取hive表(一)

    本文环境说明 centos服务器 jupyter的scala核spylon-kernel spark-2.4.0 scala-2.11.12 hadoop-2.6.0 本文主要内容 spark读取hi ...

  9. POJ3061——Subsequence(尺取法)

    Subsequence POJ - 3061 给定长度为n的数列整数a0,a1,a2-an-1以及整数S.求出总和不小于S的连续子序列的长度的最小值,如果解不存在输出0. 反复推进区间的开头和末尾,来 ...

  10. minix3使用轻快入门

    minix3是一款迷你的unix作业系统,但又不在at&t代码的基础上构建.当年开发这款作业系统的作者仅仅是拿来自用,给学生上课使用的. 如果你已经安装了minix3,你还需要安装openss ...