#设计模式-责任链模式web
#一. 责任链模式设计模式
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。服务器
责任链模式涉及到的角色以下所示:app
抽象处理者(Handler)角色:定义一个处理请求的抽象类。若是须要,能够定义一个方法以设定和返回对下家的引用。ide
具体处理者(ConcreteHandler)角色:具体处理者接到请求后,能够选择将请求处理掉,或者将请求传给下家。因为具体处理者持有对下家的引用,所以,若是须要,具体处理者能够访问下家。this
#二. 代码实现设计
申请活动费用小于500班长批准,小于1000辅导员批准,小于2000系主任批准。code
抽象Handlerxml
public abstract class Handler { protected Handler handler; public abstract boolean approve(double money); public Handler getHandler() { return handler; } public void setHandler(Handler handler) { this.handler = handler; } }
班长Handler对象
public class HandlerA extends Handler{ @Override public boolean approve(double money) { if (money<=500) { System.out.println("班长审核经过"); return true; }else{ System.out.println("班长传给了辅导员"); return handler.approve(money); } } }
辅导员Handler
public class HandlerB extends Handler{ @Override public boolean approve(double money) { if(money<=1000&&money>500){ System.out.println("辅导员审核经过"); return true; }else{ System.out.println("辅导员传给了系主任"); return handler.approve(money); } } }
系主任Handler
public class HandlerC extends Handler{ @Override public boolean approve(double money) { if (money<=2000&&money>1000) { System.out.println("系主任审核经过"); return true; }else{ System.out.println("系主任审核未经过"); return handler.approve(money); } } }
Client
public class Client { public static void main(String[] args) { HandlerA handlerA =new HandlerA(); HandlerB handlerB=new HandlerB(); HandlerC handlerC=new HandlerC(); handlerA.setHandler(handlerB); handlerB.setHandler(handlerC); handlerA.approve(1500); } }
输出结果:
班长传给了辅导员 辅导员传给了系主任 系主任审核经过
#三. Java中应用
Servlet中的过滤器
Filter接口
public interface Filter { void init(FilterConfig var1) throws ServletException; void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException; void destroy(); }
init方法
(1)在Web应用程序启动时,Web服务器将根据其web.xml文件的配置信息来建立每一个注册的Filter的实例对象,并将其保存在内存中。
(2)Web容器建立Filter的实例对象后,将当即调用该Filter对象的init方法。init方法在Filter生命周期中仅被执行一次,Web容器在调用init方法时,会传递一个包含Filter的配置和运行环境信息的FilterConfig对象。
doFilter方法
// 调用该方法会调用Filter链中的下一个Filter的doFilter方法,若是当前Filter是这条链中的最后一个Filter,则该方法会调用相应的Servlet的service方法。 void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException;
FilterChain接口
public interface FilterChain { void doFilter(ServletRequest var1, ServletResponse var2) throws IOException, ServletException; }
FilterConfig接口
//包含对FilterConfig以及FilterChain的使用 public interface FilterConfig { String getFilterName(); ServletContext getServletContext(); String getInitParameter(String var1); Enumeration getInitParameterNames(); }