当前位置: 首页 > 科技观察

三国之恋:责任链模型

时间:2023-03-12 20:37:03 科技观察

大家好,我是老田,今天给大家分享的是设计模型中的责任链模型。用恰当的生活故事和真实的项目场景来描述设计模式,最后用一句话概括这个设计模式。关于图案系列,我们之前已经分享过了:前两天又看了三国演义,在曹营看到关羽,心在汉,听说刘备在关羽过五关杀六将主要内容:第一关东陵关斩守将孔休。关名孔休,本为黄巾党余部,投降曹操,奉命五百人守东陵关,关羽车队过关时,孔休索要通关证件,和关羽发生冲突,仅仅一个回合就被关羽斩杀。第二??关,洛阳关,孟坦和韩馥。谭用鹿角挡路,先是孟谭挑战关宇,但他输了比赛。孟谈收回马匹,率领关公追来,让韩馥从背后射箭擒拿关公。孟坦一击将孟坦砍下。韩馥慌了,一箭射中了关公的左臂。关公顶着箭伤冲过鹿角,一击斩杀了韩馥,然后过了洛阳。第三关,泗水关,卞溪。得知关羽过关,东陵关孔秀、洛阳韩馥、孟谈都被杀后,卞习暗想关公难以抵挡。于是假意迎关公,并在镇国寺安排剑客伺机杀关公。多亏镇国寺老方丈普净的警示,关公才识破阴谋,与卞喜翻脸,将卞喜斩首,关公才过了泗水关。第四关,王直。这个王直是韩馥的亲家。他听说韩馥被关公所杀,非常生气,要为韩馥报仇。关公到达荥阳后,王植在关邑设宴款待关公和两位妃子。却暗中派人放火烧胡班,想烧死关公。但因关公上书其父胡华,胡班将秘密告诉了关羽。关羽和两个嫂子得以提前逃出驿站,??胡班却假装放火迷惑王直。然而王植后来才知道,他杀了胡班,前来追击关羽时被关羽斩杀,关公就这样过了荥阳。第五关,黄河渡口,秦启。这个秦琪不仅是夏侯惇最喜欢的将军,还是老将军蔡阳的侄子。他奉命守卫黄河渡口,检查过往船只。关公到了黄河渡口,正想找船过河,被秦琪拦住了。秦启不仅不让关公等人过河,还口出狂言,最终触怒了关公,被关公斩首。过程。这个故事情节让我想起了一种设计模式:责任链模式。事实上,我们生活中有很多责任链模型。比如:基本上每个公司都有自己的OA系统,主要是员工基本信息、请假、休假、报销等功能。两天有事请假,登录OA系统,发起请假审批。因为,公司对请假时间长短有如下规定:小于等于半天,审批链接:项目负责人大于半天,小于等于1天,审批链接:项目负责人+技术总监超过1天,审批环节:项目负责人+技术总监+老板可见我请假的审批流程是项目负责人+技术总监+老板。什么是责任链设计模式?什么是责任链模式?责任链模式用英文解释为:通过让多个对象有机会处理请求,避免将请求的发送者与其接收者耦合。链接接收对象并沿着链传递请求,直到对象处理它。责任链模式(ChainofResponsibilityPattern)将链中的每个节点都看作一个对象,每个节点处理不同的请求,并在内部自动维护下一个节点对象。当一个请求从链的首端发出时,会沿着责任链预设的路径依次传递给各个节点对象,直到被链中的一个对象处理,属于行为设计模式.责任链模式通用代码Java实现责任链设计模式如下:==null){System.out.println("HandlerAhandle...");}else{nextHandler.handle();}}}publicclassHandlerBextendsHandler{@Overridepublicvoidhandle(){if(nextHandler==null){System.out.println("HandlerBhandle...");}else{nextHandler.handle();}}}publicclassHandlerCextendsHandler{@Overridepublicvoidhandle(){if(getNextHandler()==null){System.out.println("HandlerChandle...");}else{getNextHandler().handle();}}}//测试.handle();}}运行结果:HandlerChandle...从上面的代码,我们可以得出UMLdiagram:从UML图中,我们可以可见,责任链模式中有两个非常重要的角色:(1)。抽象处理者角色(Handler)定义了处理请求的接口。该接口还可以提供一种方法来设置和返回对下一个对象的引用。这个角色通常由Java抽象类或Java接口来完成。(2)具体处理者角色(HandlerA,HandlerB,HandlerC)收到请求后,具体处理者可以选择处理请求,或者将请求传递给下一个对象。由于具体处理程序持有对下一个家的引用。责任链模型的优缺点优点:将请求和处理分开,将两者解耦,提供系统灵活性。缺点:性能有待商榷,当一条链很长时,非常耗时。因为我们避免建立很长的链。生活中的案例在日常生活中,责任链模型是比较常见的。我们在工作中通常会处理一些事务,往往是各个部门的通力合作才能完成某项工作。每个部门都有自己的职责。所以,很多时候,一半的工作会交给下一个部门,所有部门都通过审批后,工作才会完成。责任链模式主要是将请求和处理解耦。客户端只需要向链上发送请求,不需要关心请求的具体内容和处理细节。请求会自动传递下去,直到有节点对象进行处理。责任链模式主要适用于以下应用场景:多个对象可以处理同一个请求,但由哪个对象处理是在运行时动态确定的。向多个对象之一提交请求而不明确指定收件人。可以动态指定一组对象来处理请求。请假流程的代码实现我们先来看一下之前的案例:在OA上实现一个请假流程的Java代码。抽象处理器:leader类publicabstractclassLeader{privateLeadernext;publicvoidsetNext(Leadernext){this.next=next;}publicLeadergetNext(){returnext;}//处理请求的方法publicabstractvoidhandleRequest(doubleLeaveDays);}项目负责人publicclassProjectLeaderqueextendsLeader(LeadernextLeader(@OverridepReub){if(LeaveDays<=0.5){System.out.println("项目经理批准你请假"+LeaveDays+"天数");}else{if(getNext()!=null){getNext().handleRequest(LeaveDays);}else{System.out.println("请假天数太多,请假条无人批!");}}}}技术总监publicclassTechnicalDirectorLeaderextendsLeader{@OverridepublicvoidhandleRequest(doubleLeaveDays){if(LeaveDays<=1){System.out.println("技术总监批准你请假"+LeaveDays+"天。");}else{if(getNext()!=null){getNext().handleRequest(LeaveDays);}else{System.out.println("请假天数太多,无人批!");}}}}BosspublicclassBossLeaderextendsLeader{@OverridepublicvoidhandleRequest(doubleLeaveDays){if(LeaveDays>=2&&LeaveDays<=30){System.out.println("老板批准你请假"+LeaveDays+"天数");}else{if(getNext()!=null){getNext().handleRequest(LeaveDays);}else{System.out.println("请假天数太多,请假条无人批!");}}}}发起审批publicclassLeaveApproval{publicstaticvoidmain(String[]args){//责任组装链天,提交请假流程,打开审批链接,projectLeader.handleRequest(2);}}审批结果Boss批准你请假2.0天。如果n请假天数是31天,请假天数太多,没人批!整个请假流程是:把这个流程图改成竖着的:就是一个循环一个循环而已。通过以上两个例子和两张图,是不是更容易理解责任链模型呢?吹嘘自己是没有用的。下面就来看看高手们是如何使用责任链模式的。大佬们是怎么用的?Spring、Mybatis等框架都采用责任链模型。我们先看看它在Spring中是如何使用的。SpringMVC中的org.springframework.web.servlet.DispatcherServlet类中:getHandler方法的处理采用责任链模式,之前由Spring容器初始化handlerMappings,通过遍历找到匹配请求的HandlerhandlerMappings,这里返回的是HandlerExecutionChain对象。这个HandlerExecutionChain对象会在后面执行的时候分析为什么会返回这样一个对象。@NullableprotectedHandlerExecutionChaingetHandler(HttpServletRequestrequest)throwsException{if(this.handlerMappings!=null){for(HandlerMappingmapping:this.handlerMappings){HandlerExecutionChainhandler=mapping.getHandler(requestur);if(handler!=null)lerreturn{;}返回}以上就是Spring中责任链模型的具体使用。关于Mybatis中责任链模型的使用,请看这篇文章:总结完美诠释责任链设计模式。最后用一句话概括责任链模型:大家把门前的雪扫干净,不要管别人。本文转载自微信公众号《Java后端技术全栈》,可通过以下二维码关注。转载本文请联系Java后端技术全栈公众号。