一:业务场景
我们申请聚餐经费的审批:
项目经理只能审批500元以下的,
部门经理可以审批1000元以下的,
总经理可以审批1000元以上的
二:看看我们不用设计模式的平时代码逻辑
/** * 处理聚餐费用的对象 * @author dy * @since 2016-08-12 & JDK 1.8.0_91 */ public class FeeRequest_demo { public String requestToProjectManager(String user,double fee){ String result = ""; if (fee<500) result = this.projectManagerHandler(user, fee); else if (fee< 1000) result = this.dptManagerHandler(user, fee); else if (fee>1000) result = this.generalManagerHandler(user, fee); return result; } private String projectManagerHandler(String user,double fee){ return "项目经理同意给你报销:"+fee; } private String dptManagerHandler(String user,double fee){ return "部门经理同意给你报销:"+fee; } private String generalManagerHandler(String user,double fee){ return "总经理同意给你报销:"+fee; }
这里例子比较简单,主要是学习设计模式,又不是学习处理业务的,哈哈
ok,我们来测试下
public static void main(String[] args) { FeeRequest_demo feeRequest =new FeeRequest_demo(); System.out.println(feeRequest.requestToProjectManager("", 300)); System.out.println(feeRequest.requestToProjectManager("", 600)); System.out.println(feeRequest.requestToProjectManager("", 1200)); }
思考,以上代码有什么问题?实际业务场景中,我们的审批流程经常变更,业务处理也经常变更,这就要求我们必须设计更加灵活的程序。
三:职责链设计模式
定义:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。并将这些对象形成一条链,并沿着这条链传递该请求,直到有一个对象处理了它为止。
四:使用设计模式重写示例:
/** * 定义职责对象接口 * @author dy * @since 2016-08-12 & JDK 1.8.0_91 */ public abstract class Handler { /** * 通常持有下一个处理的请求对象 */ protected Handler nextHandler; public Handler(Handler nextHandler) { this.nextHandler = nextHandler; } /** * 处理申请 * @param user * @param fee * @return */ public abstract String requestToFee(String user,double fee); }
public class ProjectManagerHandler extends Handler { public ProjectManagerHandler(Handler nextHandler) { super(nextHandler); } @Override public String requestToFee(String user, double fee) { if (fee<500){ return "项目经理同意给你报销:"+fee; } else{ if (nextHandler != null) { return nextHandler.requestToFee(user, fee); } } return "非法处理"; } }
public class DptManagerHandler extends Handler { public DptManagerHandler(Handler nextHandler) { super(nextHandler); } @Override public String requestToFee(String user, double fee) { if (fee<1000){ return "部门经理同意给你报销:"+fee; } else{ if (nextHandler != null) { return nextHandler.requestToFee(user, fee); } } return "非法处理"; } }
public class GeneralManagerHandler extends Handler { public GeneralManagerHandler(Handler nextHandler) { super(nextHandler); } @Override public String requestToFee(String user, double fee) { if (fee>1000){ return "总经理同意给你报销:"+fee; } else{ if (nextHandler != null) { return nextHandler.requestToFee(user, fee); } } return "非法处理"; } }
ok,让我们来测试下吧!
/** * @author dy * @since 2016-08-12 & JDK 1.8.0_91 */ public class Client { public static void main(String[] args) { /** * 组装职责链 */ Handler generalHandler = new GeneralManagerHandler(null); Handler depHandler = new DptManagerHandler(generalHandler); Handler prjHandler = new ProjectManagerHandler(depHandler); System.out.println(prjHandler.requestToFee("", 300)); System.out.println(prjHandler.requestToFee("", 600)); System.out.println(prjHandler.requestToFee("", 1200)); } }
运行结果:
是不是和没有设计模式的 运行结果一抹一眼啊 !
这里就不演示处理多种请求了 ,大同小异的!
想想我们平时用到的拦截器,是不是用到了职责链设计模式啊!看来这个也很重要哦