当前位置: 首页 > news >正文

公司网站搭建费用重庆专业做网站的公司

公司网站搭建费用,重庆专业做网站的公司,珠海定制网站建设推广,营销课程培训视频责任链模式#xff08;Chain Of Responsibility Design Pattern#xff09;#xff0c;也叫做职责链#xff0c;是将请求的发送和接收解耦#xff0c;让多个接收对象都有机会处理这个请求。当有请求发生时#xff0c;可将请求沿着这条链传递#xff0c;直到有对象处理它… 责任链模式Chain Of Responsibility Design Pattern也叫做职责链是将请求的发送和接收解耦让多个接收对象都有机会处理这个请求。当有请求发生时可将请求沿着这条链传递直到有对象处理它为止。 一、责任链模式介绍 其实在日常生活中有不少使用责任链的场景。比如公司采购审批流程需要各个部门领导的批准同意。在责任链模式中客户端只需要将请求发送到责任链上无须关心请求的处理细节和传递请求会自动进行传递。 1.1 责任链模式的结构 责任链模式结构的核心在于引入了一个抽象处理类所以主要包含两个部分 一个抽象Handler类 因为责任链的存在需要定义下一个handler的引用才能形成一个链条有了下一个handler引用所以要对引用进行调用和管理于是需要setNext() 和getNext() 方法此外由于不同handler处理请求的方式不一致所以要在其中定义一个抽象的请求方法handleRequest() 一系列具体的Handler处理类 具体结构大致如下所示 abstract Handler抽象处理者定义一个处理请求的接口内部包含抽象处理方法和后继具体处理者Handler1、Handler2具体处理者具体实现抽象处理者的方法并对请求做一些逻辑处理Client客户端使用职责链模式 1.2 职责链模式的实现 根据上面的类图可以实现如下代码 /*** description: 抽象处理类* date: 2022/4/4*/ public abstract class Handler {private Handler successor;public Handler getSuccessor() {return successor;}public void setSuccessor(Handler successor) {this.successor successor;}/*** 处理请求的抽象方法* param request 请求*/public abstract void handleRequest(String request); } /*** description: 具体处理者1* date: 2022/4/4*/ public class Handler1 extends Handler{private String handler;public Handler1(String handler) {this.handler handler;}Overridepublic void handleRequest(String request) {if (handler1.equals(request)) {System.out.println(具体处理者handler1进行请求处理);} else {if (getSuccessor() ! null) {//如果指向下一个具体处理者getSuccessor().handleRequest(request);} else {System.out.println(没有处理者进行处理);}}} } /*** description: 具体处理者2* date: 2022/4/4*/ public class Handler2 extends Handler{private String handler;public Handler2(String handler) {this.handler handler;}Overridepublic void handleRequest(String request) {if (handler2.equals(request)) {System.out.println(具体处理者handler2进行请求处理);} else {if (getSuccessor() ! null) {getSuccessor().handleRequest(request);} else {System.out.println(请求没有被任何处理者处理);}}} } /*** description: 客户端类* date: 2022/4/4*/ public class Client {public static void main(String[] args) {Handler handler1 new Handler1(handler1);Handler handler2 new Handler2(handler2);handler1.setSuccessor(handler2);handler1.handleRequest(handler1);handler1.handleRequest(handler2);} }测试结果 具体处理者handler1进行请求处理 具体处理者handler2进行请求处理二、责任链模式的应用场景 责任链适用的应用场景有 当程序需要使用不同方式来处理不同种类的请求而且各个请求类型和顺 职责链模式最常见的应用就是用来开发各种框架的过滤器和拦截器比如Spring Interceptor和Servlet Filter 2.1 在Servlet Filter中的应用 Filter 可以实现对HTTP 请求的过滤功能比如鉴权、限流、记录日志、验证参数等等。比如一些Servlet 容器TomCat、Jetty等就支持Filter的过滤功能。以TomCat 为例 所以当Servlet 请求到来时首先会经过Filter 处理最后再到达Servlet实例。我这里选取的TomCat版本是SpringBoot自带的9.0先来看看FilterChain 的接口 public interface FilterChain {//Filter具体实现void doFilter(ServletRequest var1, ServletResponse var2) throws IOException, ServletException; }ApplicationFilterChain是责任链模式的具体实现类 public final class ApplicationFilterChain implements FilterChain {private ApplicationFilterConfig[] filters new ApplicationFilterConfig[0]; //Filter配置数组private int pos 0; //执行Filter的序号private int n 0; //目前Filter的个数private Servlet servlet null;public ApplicationFilterChain() {}Overridepublic void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException {//Filter 具体实现//...}public static ServletRequest getLastServicedRequest() {return (ServletRequest)lastServicedRequest.get();}public static ServletResponse getLastServicedResponse() {return (ServletResponse)lastServicedResponse.get();}void addFilter(ApplicationFilterConfig filterConfig) {ApplicationFilterConfig[] newFilters this.filters;int var3 newFilters.length;for(int var4 0; var4 var3; var4) {ApplicationFilterConfig filter newFilters[var4];if (filter filterConfig) {return;}}//增加Filterif (this.n this.filters.length) {newFilters new ApplicationFilterConfig[this.n 10];System.arraycopy(this.filters, 0, newFilters, 0, this.n);this.filters newFilters;}this.filters[this.n] filterConfig;} }2.2 在Spring Interceptor中的应用 和Servlet Filter类似在Spring 中也有对应的过滤器 Interceptor。它是由Spring MVC 框架来实现借一张来自《设计模式之美》的图片来说明 客户端发送请求首先会经过Servlet Filter然后再经过Spring Interceptor最后再到达具体的业务中。 和Filter一样Interceptor 中也是基于责任链模式来实现的与之相对的HandlerInterceptor是抽象处理接口 public interface HandlerInterceptor {default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {return true;}default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, Nullable ModelAndView modelAndView) throws Exception {}default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Nullable Exception ex) throws Exception {} }会有各种具体处理类的实现 此外在其他框架中也存在着职责链模式的使用比如Dubbo Filter、Netty ChannelPipeline等等 三、责任链模式实战 3.1 模拟三级审批责任链 简单利用职责链来设计三级审批 public static void main(String[] args) {//设计审批责任链Handler handler new FirstHandler().setNext(new SecondHandler().setNext(new ThirdHandler()));handler.doHandler(firstRequest);}//抽象处理类static abstract class Handler {private Handler next;public Handler getNext() {return next;}public Handler setNext(Handler next) {this.next next;return this;}public abstract void doHandler(String request);}//第一级审批人static class FirstHandler extends Handler {Overridepublic void doHandler(String request) {System.out.println(第一个审批处理点审批中...);if (request null || request ) {System.out.println(第一个审批节点的请求为空);;}System.out.println(第一个审批处理点审批完成);super.next.doHandler(secondRequest);}}//第二级审批人static class SecondHandler extends Handler {Overridepublic void doHandler(String request) {System.out.println(第二个审批处理点审批中...);if (request null || request ){System.out.println(第二个审批节点的请求为空);}System.out.println(第一个审批处理点审批完成);super.next.doHandler(thirdRequest);}}//第三级审批人static class ThirdHandler extends Handler {Overridepublic void doHandler(String request) {System.out.println(第三个审批处理点审批中...);Handler next super.next;if (next null){System.out.println(审批结束);}}}3.2 模拟在618大促期间的业务系统上线审批流程场景 像是这些⼀线电商类的互联⽹公司阿⾥、京东、拼多多等在618期间都会做⼀些运营活动场景以及 提供的扩容备战就像过年期间百度的红包⼀样。但是所有开发的这些系统都需要陆续的上线因为临 近618有时候也有⼀些紧急的调整的需要上线但为了保障线上系统的稳定性是尽可能的减少上线的 也会相应的增强审批⼒度。就像⼀级响应、⼆级响应⼀样。 ⽽这审批的过程在随着特定时间点会增加不同级别的负责⼈加⼊每个⼈就像责任链模式中的每⼀个核 ⼼点。对于研发并不需要关⼼具体的审批流程处理细节只需要知道这个上线更严格级别也更 ⾼但对于研发⼈员来说同样是点击相同的提审按钮等待审核。 使用责任链模式可以将各个服务模块按照一、二、三级进行分离每个级别可以像Filter一样用Successor下一个级别的方法进行调用。具体结构图如下来自《重学Java设计模式》 具体代码结构 │——AuthInfo.java │——AuthLink.java │ ├─business │ AuthService.java │ └─implLevel1AuthLink.javaLevel2AuthLink.javaLevel3AuthLink.java 实现代码 /*** description: 链路抽象审批* date: 2022/4/4*/ public abstract class AuthLink {/**时间格式化**/protected SimpleDateFormat f new SimpleDateFormat(yyyy-MM-dd HH:mm:ss);/**级别人员ID**/protected String levelUserId;/**级别人员姓名**/protected String levelUserName;/**下一个链路**/private AuthLink next;public AuthLink(String levelUserId, String levelUserName) {this.levelUserId levelUserId;this.levelUserName levelUserName;}public AuthLink next() {return next;}public AuthLink appendNext(AuthLink next) {this.next next;return this;}/**每个具体处理者必须实现的方法**/public abstract AuthInfo doAuth(String uId, String orderId, Date authDate); } /*** description: 责任链中返回对象的定义* date: 2022/4/4*/ public class AuthInfo {private String code;private String info ;public AuthInfo(String code, String... infos) { //...表示可变长参数可以传入多个参数this.code code;for (String s : infos) {this.info this.info.concat(s);}}public String getCode() {return code;}public void setCode(String code) {this.code code;}public String getInfo() {return info;}public void setInfo(String info) {this.info info;} } /*** description: 一级审核人* date: 2022/4/4*/ public class Level1AuthLink extends AuthLink {public Level1AuthLink(String levelUserId, String levelUserName) {super(levelUserId, levelUserName);}Overridepublic AuthInfo doAuth(String uId, String orderId, Date authDate) {Date date AuthService.queryAuthInfo(levelUserId, orderId);if (null date) {return new AuthInfo(0001, 单号, orderId, 状态一级审批负责人, levelUserName);}AuthLink next super.next();if (null next) {return new AuthInfo(0000, 单号, orderId, 状态一级审批负责人, 时间, f.format(date), 审批人, levelUserName);}return next.doAuth(uId, orderId, authDate);} } /*** description: 测试类* date: 2022/4/5*/ public class ApiTest {private Logger logger LoggerFactory.getLogger(ApiTest.class);Testpublic void test_AuthLink() throws ParseException {//创建审批链条AuthLink authLink new Level3AuthLink(1000013, 王工).appendNext(new Level2AuthLink(1000012, 张经理).appendNext(new Level1AuthLink(1000011, 赵总裁)));logger.info(测试结果{}, JSON.toJSONString(authLink.doAuth(ethan, 100099800423123, new Date())));//将单号和用户id存入authMap中AuthService.auth(1000013, 100099800423123);logger.info(测试结果{}, 模拟二级审批王工);logger.info(测试结果{},JSON.toJSONString(authLink.doAuth(ethan, 100099800423123, new Date())));AuthService.auth(1000012, 100099800423123);logger.info(测试结果{}, 模拟二级负责人审批张经理);logger.info(测试结果{}, JSON.toJSONString(authLink.doAuth(ethan, 100099800423123, new Date())));AuthService.auth(1000011, 100099800423123);logger.info(测试结果{}, 模拟二级负责人审批赵总裁);logger.info(测试结果{}, JSON.toJSONString(authLink.doAuth(ethan, 100099800423123, new Date())));} }最后的测试结果 10:05:08.675 [main] INFO ApiTest - 测试结果{code:0001,info: 单号100099800423123 状态待三级审批 王工} 10:05:08.679 [main] INFO ApiTest - 测试结果模拟三级审批王工 10:05:08.680 [main] INFO ApiTest - 测试结果{code:0001,info: 单号100099800423123 状态待二级审批负责人张经理} 10:05:08.680 [main] INFO ApiTest - 测试结果模拟二级负责人审批张经理 10:05:08.680 [main] INFO ApiTest - 测试结果{code:0001,info: 单号100099800423123状态待一级审批负责人赵总裁} 10:05:08.680 [main] INFO ApiTest - 测试结果模拟一级负责人审批赵总裁 10:05:08.680 [main] INFO ApiTest - 测试结果{code:0000,info: 单号100099800423123状态一级审批完成负责人 时间2023-09-11 10:05:08审批人赵总裁}参考资料 《设计模式之美》 http://c.biancheng.net/view/4024.html 《重学Java设计模式》
http://www.zqtcl.cn/news/863765/

相关文章:

  • php网站怎么做302织梦网站有会员系统怎么做
  • 清远建设局网站安阳吧百度贴吧
  • 做什么软件做网站效率最好网站公司建设都招聘那些职位
  • 缙云建设局网站深圳营销型网站设计
  • 企业网站制作价格成都高端网站建设公司哪家好
  • wordpress+做仿站网站建设费用属于业务宣传费吗
  • 昆明企业网站制作wordpress移动端插件menu
  • 长沙网站设计培训学校南宁建设网站哪里好
  • 提高基层治理效能全国seo搜索排名优化公司
  • 如何建设网站简介WordPress集成tipask
  • 青海网站开发公司建筑公司的愿景怎么写
  • 建设银行集团网站首页优化科技
  • dede 汽车网站网站上的彩票走势图是怎么做的
  • 网站内容营销呼市推广网站
  • 南宁网站建设价格医院有关页面设计模板
  • 城乡住房和城乡建设厅网站湖州公司网站建设
  • h5响应式的网站建站空间哪个好
  • 徐州网站建设与推广公众号开发技术风险
  • 男女做差差事的视频网站自己做一个小程序要多少钱
  • 临沂网站建设哪家好重庆建设招标造价信息网站
  • 筑巢网络官方网站深圳网站开发设计公司排名
  • 镇江市网站制作网页的代码实例
  • 吉林省网站制作公司有哪些唐山设计网站公司
  • 浙江国泰建设集团有限公司网站ps软件下载电脑版免费怎么下载
  • 昆明网站建设价格自力教育
  • 黄冈网站推广软件视频下载孝感做网站xgsh
  • 用jsp做一网站的流程图互联网博客网站
  • 南宁一站网 给网站做营销微网站和网站同步像素
  • 如何建设一个视频小网站软件做网站
  • 小企业网站建设公司哪家好网站怎样设计网页