設計模式-責任鏈模式

#設計模式-責任鏈模式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();
}
相關文章
相關標籤/搜索