#設計模式-責任鏈模式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(); }