一套过滤器,让你的代码高处不胜寒
一、介绍
过滤器模式,顾名思义,从名字上就可以看出主要用于过滤对象,实现起来也很简单!
从设计的角度看,过滤器模式涉及到三个角色:抽象过滤器角色:主要定义过滤器的行为;具体滤器角色:实现或者继承抽象过滤器,完善具体算法;客户端:客户类提出使用具体类的请求;
话不多说,代码直接撸起来二、示例
下面,我们以班级同学为例,过滤出满足要求的同学,实现过程如下!
先创建一个数据实体类Person,如下:数据实体类publicclassPerson{privateStringname;姓名privateStringgender;性别privateintage;年龄publicStringgetName(){returnname;}。。。省略setgetpublicPerson(Stringname,Stringgender,intage){this。namename;this。gendergender;this。ageage;}OverridepublicStringtoString(){returnPerson{namename,gendergender,ageage};}}
然后,创建一个过滤器标准接口Filter,代码如下:过滤器接口publicinterfaceFilter{过滤操作parampersonListreturnListPersonfilterOperate(ListPersonpersonList);}
接着,创建过滤器具体实现类AgeFilter、GenderFilter,代码如下:过滤已满足18岁的同学publicclassAgeFilterimplementsFilter{OverridepublicListPersonfilterOperate(ListPersonpersonList){ListPersontargetListnewArrayList();for(Personperson:personList){if(person。getAge()18){targetList。add(person);}}returntargetList;}}过滤出性别为男的同学publicclassGenderFilterimplementsFilter{OverridepublicListPersonfilterOperate(ListPersonpersonList){ListPersontargetListnewArrayList();for(Personperson:personList){if(男。equals(person。getGender())){targetList。add(person);}}returntargetList;}}
最后,编写一个测试类如下:publicclassFilterClient{publicstaticvoidmain(String〔〕args){ListPersonpersonListnewArrayList();personList。add(newPerson(程咬金,男,36));personList。add(newPerson(露娜,女,16));personList。add(newPerson(伽啰,女,18));personList。add(newPerson(苏烈,男,40));personList。add(newPerson(武则天,女,24));personList。add(newPerson(韩信,男,16));过程出年龄已满18周岁的同学FilterageFilternewAgeFilter();personListageFilter。filterOperate(personList);System。out。println(personList);System。out。println(分隔符);过滤出性别为男的同学FiltergenderFilternewGenderFilter();personListgenderFilter。filterOperate(personList);System。out。println(personList);}}
输出结果:〔Person{name程咬金,gender男,age36},Person{name伽啰,gender女,age18},Person{name苏烈,gender男,age40},Person{name武则天,gender女,age24}〕分隔符〔Person{name程咬金,gender男,age36},Person{name苏烈,gender男,age40}〕
当然,还可以按照姓名过滤,只需要写一个过滤器实现类,然后在客户端加入过滤即可!三、应用
过滤器模式的应用,当属我们最熟悉的JavaWeb工程中的Filter,如果我们想自定义一个过滤器,只需要实现Filter即可!例如创建一个允许跨域的Filter过滤器,如下:ServletFilterimplementationclassCrossOriginFilterpublicclassCrossOriginFilterimplementsFilter{privatebooleanisCrossfalse;Defaultconstructor。publicCrossOriginFilter(){TODOAutogeneratedconstructorstub}seeFilterdestroy()publicvoiddestroy(){TODOAutogeneratedmethodstub}seeFilterdoFilter(ServletRequest,ServletResponse,FilterChain)publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletException{TODOAutogeneratedmethodstubplaceyourcodehereif(isCross){HttpServletRequesthttpServletRequest(HttpServletRequest)request;HttpServletResponsehttpServletResponse(HttpServletResponse)response;System。out。println(拦截请求:httpServletRequest。getServletPath());httpServletResponse。setHeader(AccessControlAllowOrigin,);httpServletResponse。setHeader(AccessControlAllowOrigin,httpServletRequest。getHeader(Origin));httpServletResponse。setHeader(AccessControlAllowCredentials,true);httpServletResponse。setHeader(AccessControlAllowMethods,POST,GET,OPTIONS,DELETE);httpServletResponse。setHeader(AccessControlMaxAge,3600);httpServletResponse。setHeader(AccessControlAllowHeaders,xrequestedwith);}passtherequestalongthefilterchainchain。doFilter(request,response);}seeFilterinit(FilterConfig)publicvoidinit(FilterConfigfConfig)throwsServletException{TODOAutogeneratedmethodstub}}四、总结
过滤器模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来,操作也比较简单,在实际开发中,使用非常广泛。