2026/6/20 3:21:16
网站建设
项目流程
汕头响应式网站,吉林整站优化,创建网站怎么弄,冠县建设局网站目录 一、总体对比二、状态模式三、责任链模式四、扩展#xff1a;手撸Java WebFilter实现 一、总体对比
状态模式和责任链模式都是行为型设计模式#xff0c;但它们的意图和应用场景不同#xff1a;
对比项状态模式责任链模式意图允许对象在内部状态改变时改变它的行为手撸Java WebFilter实现一、总体对比状态模式和责任链模式都是行为型设计模式但它们的意图和应用场景不同对比项状态模式责任链模式意图允许对象在内部状态改变时改变它的行为看起来就像改变了其类。使多个对象都有机会处理请求将这些对象连成一条链并沿着这条链传递请求直到有对象处理它为止。结构通常有一个上下文Context对象和多个状态State对象。上下文持有当前状态的引用行为委托给当前状态对象。有一个处理者接口每个处理者持有下一个处理者的引用。请求沿链传递直到被处理。应用场景对象的行为依赖于它的状态并且在运行时可能根据状态变化而改变行为。有多个对象可以处理同一个请求具体由谁处理在运行时决定。示例工作流引擎、订单状态流转、TCP连接状态。Java Web Filter、日志处理链、审批流。总结状态模式关注“对象状态的切换”每个状态封装一组行为状态切换时行为也随之切换。状态模式强调“同一个对象在不同状态下的行为变化”。责任链模式关注“请求的传递”每个处理者决定是否处理请求或传递给下一个处理者。责任链模式强调“多个对象对同一请求的处理机会”。二、状态模式类图ClientContext- state: State request()«interface»State handle(Context)ConcreteStateA handle(Context)ConcreteStateB handle(Context)示例代码publicinterfaceState{voidhandle(Contextcontext);}publicclassConcreteStateAimplementsState{Overridepublicvoidhandle(Contextcontext){System.out.println(当前状态A切换到B);context.setState(newConcreteStateB());}}publicclassConcreteStateBimplementsState{Overridepublicvoidhandle(Contextcontext){System.out.println(当前状态B切换到A);context.setState(newConcreteStateA());}}publicclassContext{privateStatestate;publicContext(Statestate){this.statestate;}publicvoidsetState(Statestate){this.statestate;}publicvoidrequest(){if(state!null){state.handle(this);}}}publicclassClient{publicstaticvoidmain(String[]args){ContextcontextnewContext(newConcreteStateA());context.request();// A - Bcontext.request();// B - A}}三、责任链模式类图nextClient«abstract»HandlersetNext(Handler)handleRequest(Request)ConcreteHandlerAhandleRequest(Request)ConcreteHandlerBhandleRequest(Request)示例代码publicabstractclassHandler{protectedHandlernext;publicvoidsetNext(Handlernext){this.nextnext;}publicabstractvoidhandleRequest(Stringrequest);}publicclassConcreteHandlerAextendsHandler{OverridepublicvoidhandleRequest(Stringrequest){if(A.equals(request)){System.out.println(ConcreteHandlerA 处理请求: request);}elseif(next!null){next.handleRequest(request);}else{System.out.println(请求未被处理: request);}}}publicclassConcreteHandlerBextendsHandler{OverridepublicvoidhandleRequest(Stringrequest){if(B.equals(request)){System.out.println(ConcreteHandlerB 处理请求: request);}elseif(next!null){next.handleRequest(request);}else{System.out.println(请求未被处理: request);}}}publicclassClient{publicstaticvoidmain(String[]args){HandlerhandlerAnewConcreteHandlerA();HandlerhandlerBnewConcreteHandlerB();handlerA.setNext(handlerB);handlerA.handleRequest(A);// ConcreteHandlerA 处理请求: AhandlerA.handleRequest(B);// ConcreteHandlerB 处理请求: BhandlerA.handleRequest(C);// 请求未被处理: C}}两者本质区别状态模式是“状态驱动行为”责任链模式是“链式传递请求”。四、扩展手撸Java WebFilter实现Java WebFilter 链式调用的实现原理是基于“责任链模式”Chain of Responsibility Pattern。每个 Filter 处理请求后可以选择继续传递给下一个 Filter 或终止链路。Filter 链由容器如 Tomcat维护依次调用每个 Filter 的 doFilter 方法最后到达目标 Servlet。原理简述每个 Filter 通过doFilter(ServletRequest, ServletResponse, FilterChain)方法接收请求。FilterChain负责调用下一个 Filter 或最终的 Servlet。责任链模式每个处理者Filter持有对下一个处理者FilterChain的引用。示例代码自定义 Filter 实现// MyFilter.javaimportjavax.servlet.*;importjava.io.IOException;publicclassMyFilterimplementsFilter{OverridepublicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletException{// 前置处理System.out.println(MyFilter 前置处理);// 传递给下一个 Filter 或 Servletchain.doFilter(request,response);// 后置处理System.out.println(MyFilter 后置处理);}}责任链模式简化实现模拟 FilterChain// Filter.javapublicinterfaceFilter{voiddoFilter(Requestrequest,Responseresponse,FilterChainchain);}// FilterChain.javaimportjava.util.List;publicclassFilterChain{privateListFilterfilters;privateintindex0;publicFilterChain(ListFilterfilters){this.filtersfilters;}publicvoiddoFilter(Requestrequest,Responseresponse){if(indexfilters.size()){filters.get(index).doFilter(request,response,this);}else{// 最终处理如ServletSystem.out.println(到达最终处理Servlet);}}}// Request.java / Response.javapublicclassRequest{}publicclassResponse{}使用链式调用// Main.javaimportjava.util.Arrays;publicclassMain{publicstaticvoidmain(String[]args){Filterfilter1(req,res,chain)-{System.out.println(Filter1 前置);chain.doFilter(req,res);System.out.println(Filter1 后置);};Filterfilter2(req,res,chain)-{System.out.println(Filter2 前置);chain.doFilter(req,res);System.out.println(Filter2 后置);};FilterChainchainnewFilterChain(Arrays.asList(filter1,filter2));chain.doFilter(newRequest(),newResponse());}}输出示例Filter1 前置 Filter2 前置 到达最终处理Servlet Filter2 后置 Filter1 后置总结Filter 链式调用本质是责任链模式的应用。每个 Filter 处理完后通过chain.doFilter传递给下一个 Filter 或最终 Servlet。这样实现了请求处理的灵活扩展和解耦。