责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。
就是每一个类只负责自己的模块的功能。
应用实例: 1、红楼梦中的”击鼓传花”。 2、JS 中的事件冒泡。 3、JAVA WEB 中 Apache Tomcat 对 Encoding 的处理,Struts2 的拦截器,jsp servlet 的 Filter。
请假请求类
/*** @author meikb* @desc 请假请求类* @date 2020-05-23 16:59*/public class LeaveRequest {public LeaveRequest(int day){this.day = day;}private int day;public int getDay() {return day;}public void setDay(int day) {this.day = day;}}
抽象类
/*** @author meikb* @desc 请假抽象类* @date 2020-05-23 16:21*/public abstract class AbstractLeave {public int min = 1;public int middle = 3;public int max = 5;protected AbstractLeave nextHandler;public void handLeave(LeaveRequest request){}public AbstractLeave getNextHandler() {return nextHandler;}public void setNextHandler(AbstractLeave nextHandler) {this.nextHandler = nextHandler;}}
一级审核人
/*** @author meikb* @desc* @date 2020-05-23 16:57*/public class FirstLeader extends AbstractLeave{@Overridepublic void handLeave(LeaveRequest request) {if(request.getDay() <= min){System.out.println("审核完成");return;}System.out.println("一级领导审核通过");if(null != this.nextHandler){this.nextHandler.handLeave(request);}}@Overridepublic void setNextHandler(AbstractLeave nextHandler) {super.setNextHandler(nextHandler);}}
二级审核人
/*** @author meikb* @desc* @date 2020-05-23 16:57*/public class SecondLeader extends AbstractLeave{@Overridepublic void handLeave(LeaveRequest request) {if(request.getDay() <= middle){System.out.println("二级审核完成");return;}System.out.println("二级审核通过");if(null != this.nextHandler){this.nextHandler.handLeave(request);}}@Overridepublic void setNextHandler(AbstractLeave nextHandler) {super.setNextHandler(nextHandler);}}
三级审核人
/*** @author meikb* @desc* @date 2020-05-23 16:57*/public class ThridLeader extends AbstractLeave{@Overridepublic void handLeave(LeaveRequest request) {System.out.println("三级领导审核完成");if(null != this.nextHandler){this.nextHandler.handLeave(request);}}@Overridepublic void setNextHandler(AbstractLeave nextHandler) {super.setNextHandler(nextHandler);}}
主函数
/*** @author meikb* @desc 主函数* @date 2020-05-23 17:06*/public class ChainMain {public static void main(String[] args) {LeaveRequest request = new LeaveRequest(4);FirstLeader firstLeader = new FirstLeader();SecondLeader secondLeader = new SecondLeader();ThridLeader thridLeader = new ThridLeader();firstLeader.setNextHandler(secondLeader);secondLeader.setNextHandler(thridLeader);firstLeader.handLeave(request);}}
