欢迎来到天天文库
浏览记录
ID:22801988
大小:216.24 KB
页数:5页
时间:2018-10-31
《用责任链模式构筑信息校验组件》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、用职责链模式构筑信息校验组件模式定义职贵链模式(ChainofResponsibilityPattern):避免请求发送者与接收者稱合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。由于英文翻译的不同,职贵链模式又称为责任链模式,它是一种对象行为型模式。模式结构ClientHandler-successor:Handler+handleRequest()successorConcreteHandlerAConcreteHandlerB+handleRequest()+handleRequest()模式分析在职责链模式里,很多对
2、象由每一个对象对其下家的引用而连接起来形成-条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发岀这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织链和分配责任。模式代码publicabstractclassHandler!protectedHandlersuccessor;publicvoidsetSuccessor(Handlersuccessor){this.successor=successor;}publicabstractvoidhandleRequest(Stringrequest);/publicc
3、lassConcreteHandlerextendsHandler{publicvoidhcindleRequest(Stringrequest){if(请求request满足条件)I//处理请求;}else{this.successorJiandleRequest(request);//转发请求职责链模式实例与解析场景:最近碰到一个应用场景,服务器需要处理客户端请求的验证,如身份证规则、手机号码规则、地市条件等等。分析:以固有的忍维,处理此类验证往往采用不断的结构进行处理,对于不同的判断逻辑,采取不同的判断语句块进行处理。这样下来导致代码的可读性不强,各个判断逻辑无法共享,如增加新
4、的规则必须破坏原來的结构,留下系统Bug的风险。引入原因:引入职贵链模式构建验证库,可以将原来绑定的验证规则进行结构,形成独立的校验类,针对客户端的校验请求,系统只需要将校验规则组成职责链,然后将客广端请求在这个校验职责链上传递,知道每个校验完成即可。这样可以方便的增加新的校验规则,有效保证系统的伸缩性。组件类图:飞zValiaaleCfteckTypeValidateKobileX-^xV*:£sateC-istArea®-rali(:Striae番valisatst:StriaravalisaieKec^est(:StrircHttpServletFe^ueRtrequest*客
5、户端调用示例:ValidateHandlervCheckType=newValidateCheckType();ValidateHandlervCustArea=newValidateCustArea();ValidateHandlervMobi1eNum=newValidateMobi1eNum();vCheckType.setSuccessor(vCustArea);vCustArea.setSuccessor(vMobiieNum);returnvCheckType.validateRequest(request);ValidateHandler实现类处理:publicabst
6、ractclassValidateHandler{protectedValidateHandlersuccessor;*用于校验Request输入指定参数,布子类实现*/protectedabstractStringvalidateRequest(HttpServletRequestrequest);publicValidateHandlergetSuccessor(){returnsuccessor;}publicvoidsetSuccessor(ValidateHandlersuccessor){this.successor=successor;}}ValidateCheckTy
7、pe实现类处理:publicclassValidateCheckTypeextendsValidateHandler{protectedStringvalidateRequest(HttpServletRequestrequest){//TODOAuto-generatedmethodstubStringcity=request•getPara/neter(亡y"J,•//校验地市编码合法性if(null==city){return"200004”;}Li
此文档下载收益归作者所有