最新微软官方MSDN原版Win10系统下载

当前位置:主页 > U盘装系统 > U盘装win7系统 >

设计模式之 责任链模式(附Filter源码分析)

时间:2021-10-09    来源:英雄联盟押注网站    人气:

本文摘要:责任链设计模式就是将原本庞大的混淆在一起的处置惩罚逻辑举行拆分,根据业务、相关性等因素拆分到多个处置惩罚器中,每个处置惩罚器只卖力一部门逻辑处置惩罚;在执行的时候,一个处置惩罚器接一个处置惩罚器的从前到后的执行,在结构上看就像一个链条,这也是责任链名字的由来。责任链设计模式能够让代码结构更清晰,更易于应对日后的功效扩展。

英雄联盟押注网站

责任链设计模式就是将原本庞大的混淆在一起的处置惩罚逻辑举行拆分,根据业务、相关性等因素拆分到多个处置惩罚器中,每个处置惩罚器只卖力一部门逻辑处置惩罚;在执行的时候,一个处置惩罚器接一个处置惩罚器的从前到后的执行,在结构上看就像一个链条,这也是责任链名字的由来。责任链设计模式能够让代码结构更清晰,更易于应对日后的功效扩展。场景举例好比一张优惠券,在使用的时候,后台代码要凭据下单信息来判断这张优惠券是否可用,涉及判断的条件很是多,判断因素假设包罗:1、坎级,好比这张优惠券需要满100减10,满200减20,那么当前订单金额是否满足100元或200元;2、品牌或品类,好比这张优惠券只能用在购置康师傅品牌的商品;3、支付类型,只能线上支付时使用这张优惠券;4、可用工具,只有购置平台自售商品才气使用这张优惠券,购置三方店肆商品则不能使用这张优惠券(类似京东某些券只能购置平台自营商品)。

实际上的业务可能包罗更多条件和因素,实际的判断逻辑也会更庞大。如果我们将这些平铺直叙的堆砌到代码里,实际可能一个类中根据差别因素,添加多个方法,最终有一个入口方法组织这些方法来判断。代码类似于://判断坎级方法public boolean 坎级(Coupon c) { ...}//判断品牌或品类方法public boolean 品牌或品类(Coupon c) { ...}//判断支付类型方法public boolean 支付类型(Coupon c) { ...}//判断可用工具方法public boolean 可用工具(Coupon c) { ...}//判断优惠券是否可用入口方法public boolean 入口(Coupon c) { 坎级(Coupon c) 品牌或品类(Coupon c) 支付类型(Coupon c) 可用工具(Coupon c) return 效果}上面这种写法相对还能够接受,可是如果有的开发者直接一个大方法包罗了所有逻辑(搞一个5000行代码的方法),这对以后业务变换后的升级革新挖下了一个大大的坑。那么我们用责任链如何革新呢?1、首先界说接口,接口中界说handle方法public interface IHandler { boolean handle();}2、根据业务需要实现4个处置惩罚器,都实现了IHandler 接口,并实现了handle方法import java.util.Random;/** * 坎级 */public class HandlerA implements IHandler { @Override public boolean handle() { Random r = new Random(); //生成随机整数,能被2整除表现业务逻辑为true,否则为false boolean b = r.nextInt(10)%2 == 0; System.out.println("exec 坎级:" + b); return b; }}import java.util.Random;/** * 品牌或品类 */public class HandlerB implements IHandler { @Override public boolean handle() { Random r = new Random(); boolean b = r.nextInt(10)%2 == 0; System.out.println("exec 品牌或品类:" + b); return b; }}import java.util.Random;/** * 支付类型 */public class HandlerC implements IHandler { @Override public boolean handle() { Random r = new Random(); boolean b = r.nextInt(10)%2 == 0; System.out.println("exec 支付类型:" + b); return b; }}/** * 可用工具 */public class HandlerD implements IHandler { @Override public boolean handle() { Random r = new Random(); boolean b = r.nextInt(10)%2 == 0; System.out.println("exec 可用工具:" + b); return b; }}3、责任链执行import java.util.ArrayList;import java.util.List;public class Client { void handle(List<IHandler> hl) { System.out.println("---全部执行---"); for(IHandler h:hl) { //不管每个处置惩罚器的验证效果是否为true,都市把处置惩罚器执行一遍 h.handle(); } } void handle2(List<IHandler> hl) { System.out.println("---某个执行器验证不通过则退出执行---"); for(IHandler h:hl) { //如果验证不通过直接退出执行 if(!h.handle()) { break; } } } public static void main(String[] args) { List<IHandler> hl = new ArrayList<>(); IHandler ha = new HandlerA(); IHandler hb = new HandlerB(); IHandler hc = new HandlerC(); IHandler hd = new HandlerD(); hl.add(ha); hl.add(hb); hl.add(hc); hl.add(hd); Client c = new Client(); c.handle(hl); c.handle2(hl); }}我们的责任链的每个处置惩罚器用的list来生存,就是main函数的这段代码:List<IHandler> hl = new ArrayList<>(); IHandler ha = new HandlerA(); IHandler hb = new HandlerB(); IHandler hc = new HandlerC(); IHandler hd = new HandlerD(); hl.add(ha); hl.add(hb); hl.add(hc); hl.add(hd);然后在handle方法中使用循环依次执行,最终形成了一个链条执行的效果。

这里的demo实现了两个handle方法,handle方法是不管每个处置惩罚器的验证效果是否为true,都市把处置惩罚器执行一遍,handle2方法是某个执行器验证不通过则退出执行,这个可以根据实际的业务场景需要来定。其实责任链另有一种模式,就是每个handler类都持有下一个handle,也就是在上面demo的HandlerA 、HandlerB、HandlerC、HandlerD中界说一个IHandler接口类型的元素,这样每个处置惩罚器就可以生存这个处置惩罚器之后的处置惩罚器,这样在当前hander类执行完handle方法后,可以直接挪用下一个handler的handle方法,这种更像是一种责任链。

英雄联盟押注网站

代码如下: IHandler ha = new HandlerA(); IHandler hb = new HandlerB(); IHandler hc = new HandlerC(); IHandler hd = new HandlerD(); ha.setHandle(hb); hb.setHandle(hc); hc.setHandle(hd); 这样不使用list,也可以使多个处置惩罚器形成一个链条。总结:责任链就是将庞大的处置惩罚逻辑举行拆分,拆分成多个的处置惩罚器来逐个处置惩罚,各个处置惩罚器形成一个链条,每个处置惩罚器处置惩罚完后再通报给后续处置惩罚器继续处置惩罚。责任链设计模式适用于庞大的逻辑判断处置惩罚的场景。

接下来我们看一个实际应用案例。我们要分析的就是Java Web项目中的Filter。Servlet中的Filter的作用就是在浏览器请求实际执行到目的Servlet之前,做前置处置惩罚,并可以在目的Servlet将效果返回到浏览器之前,对返回效果举行处置惩罚。首先基于maven新建一个web项目,我们以idea为例,新建web项目。

1、菜单 File–>New–>Project2、选择Maven,选择“maven-archetype-webapp”3、界说Manve项目的GroupId和ArtifactId这样就生成了一个WEB项目,接下来我们新建两个Filter类,划分是FilterA和FilterB。import java.io.IOException;public class FilterA implements javax.servlet.Filter { public void destroy() { } public void doFilter(javax.servlet.ServletRequest req, javax.servlet.ServletResponse resp, javax.servlet.FilterChain chain) throws javax.servlet.ServletException, IOException { System.out.println("FilterA Start..."); chain.doFilter(req, resp); System.out.println("FilterA End..."); } public void init(javax.servlet.FilterConfig config) throws javax.servlet.ServletException { }}import javax.servlet.*;import javax.servlet.annotation.WebFilter;import java.io.IOException;@WebFilter(filterName = "FilterB")public class FilterB implements Filter { public void destroy() { } public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException { System.out.println("FilterB Start..."); chain.doFilter(req, resp); System.out.println("FilterB End..."); } public void init(FilterConfig config) throws ServletException { }}web.xml添加设置:<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" ><web-app> <display-name>Archetype Created Web Application</display-name> <filter> <filter-name>FilterA</filter-name> <filter-class>com.itzhimei.study.FilterA</filter-class> </filter> <filter-mapping> <filter-name>FilterA</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter> <filter-name>FilterB</filter-name> <filter-class>com.itzhimei.study.FilterB</filter-class> </filter> <filter-mapping> <filter-name>FilterB</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>启动这个web服务,并会见首页:localhost:8080/输出效果:FilterA Start...FilterB Start...业务ServletFilterB End...FilterA End...我们根据效果,可以或许倒推出来Filter的逻辑:设置的责任链会依次执行,Filter的执行是在真正的目的Servlet之前和之后执行的。

效果如下图:两个Filter和Servlet的执行,就像是又给链条,一个接一个的执行,浏览器请求到后端服务后,先执行FilterA的code代码,然后执行chain.doFilter()方法;然后执行FilterB的code代码,然后执行chain.doFilter()方法,将请求继续像后通报继续执行,直到业务Servlet执行完成返回,又会依次执行B的code,A的code,然后返回效果给浏览器。我们对代码举行断点,可以看到,项目中界说的Filter都市存到filters中,当前项目中有3个filter,两个是我们界说的,一个是tomcat的。每当挪用chain.doFilter()的时候,都市从filters中取出下一个filter继续执行。pos表现当前执行到谁人filter,n表现一个有几多个filter。


本文关键词:设计模式,之,责任,链,模式,附,Filter,源码,英雄联盟押注网站,分析

本文来源:英雄联盟押注网站-www.linabear.com

相关文章

U盘装win7系统排行榜

更多>>

U盘装系统排行榜

更多>>

系统教程排行榜

更多>>

公众号