Java描述设计模式(15):责任链模式
本文源码:
GitHub·点这里 ||
GitEE·点这里
一、生活场景描述1、请假审批流程公司常见的请假审批流程:请假天数 当 day<=3 天,项目经理审批 当 3<day<=5 天,部门经理审批 当 day>5 天,CEO审批 2、流程图解3、代码实现public class C01_InScene { public static void main(String[] args) { // 组装责任链 AuditHandler h1 = new CeoManger(); AuditHandler h2 = new DeptManger(); AuditHandler h3 = new ProjectManger(); h3.setSuccessor(h2); h2.setSuccessor(h1); /* * 测试输出 * 项目经理无权审批 * 部门经理无权审批 * CEO审批:同意【Cicada】,请假【6】天 */ h3.handleLeaveDay("Cicada",6); } } abstract class AuditHandler { //持有下一个处理请求的对象 protected AuditHandler successor = null; public AuditHandler getSuccessor() { return successor; } public void setSuccessor(AuditHandler successor) { this.successor = successor; } public abstract void handleLeaveDay (String user,Integer day); } /** * 项目经理审批 */ class ProjectManger extends AuditHandler{ @Override public void handleLeaveDay(String user,Integer day) { if (day <= 3){ System.out.println("项目经理审批:同意【"+user+"】,请假【"+day+"】天"); } else { System.out.println("项目经理无权审批"); if (getSuccessor() != null){ getSuccessor().handleLeaveDay(user,day); } } } } /** * 部门经理审批 */ class DeptManger extends AuditHandler{ @Override public void handleLeaveDay(String user,Integer day) { if (day > 3 && day <= 5){ System.out.println("部门经理审批:同意【"+user+"】,请假【"+day+"】天"); } else { System.out.println("部门经理无权审批"); if (getSuccessor() != null){ getSuccessor().handleLeaveDay(user,day); } } } } /** * CEO审批 */ class CeoManger extends AuditHandler{ @Override public void handleLeaveDay(String user,Integer day) { if (day > 5){ System.out.println("CEO审批:同意【"+user+"】,请假【"+day+"】天"); } else { if (getSuccessor() != null){ getSuccessor().handleLeaveDay(user,day); } } } } 二、责任链模式1、基础概念
2、核心角色(1)、抽象处理者角色
(2)、具体处理者角色
3、模式图解4、源代码实现public class C02_Chain { public static void main(String[] args) { // 组装责任链 Handler handler1 = new ConcreteHandler(); Handler handler2 = new ConcreteHandler(); handler1.setHandler(handler2); // 提交请求 handler1.handlerRequest(); } } /** * 抽象处理者角色 */ abstract class Handler { /* * 持有后续的责任对象 */ protected Handler handler; /** * 处理请求的方法 */ public abstract void handlerRequest(); public Handler getHandler() { return handler; } public void setHandler(Handler handler) { this.handler = handler; } } /** * 具体处理者角色 */ class ConcreteHandler extends Handler{ /** * 调用该方法处理请求 */ @Override public void handlerRequest() { /* * 判断是否有后续的责任对象,没有就出来请求,有就直接放过 */ if(getHandler() != null){ System.out.println("放过请求,下个对象处理..."); getHandler().handlerRequest(); } else{ System.out.println("直接处理请求了..."); } } } 三、Spring框架应用1、DispatcherServlet类的
HandlerExecutionChain mappedHandler = null; mappedHandler = this.getHandler(processedRequest); mappedHandler.applyPreHandle(processedRequest,response); mappedHandler.applyPostHandle(processedRequest,response,mv); 2、HandlerExecutionChain类这里分析的几个方法,都是从DispatcherServlet类的doDispatch方法中请求的。
四、模式总结
五、源代码地址GitHub·地址 https://github.com/cicadasmile/model-arithmetic-parent GitEE·地址 https://gitee.com/cicadasmile/model-arithmetic-parent (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |