java 設計模式 -- 責任鏈模式
阿新 • • 發佈:2017-07-21
ddc 結果 fun intercept lock -s xtend print blog
設計模式 – 責任鏈模式
介紹:
責任鏈模式是一種動態行為模式,有多個對象,每一個對象分別擁有其下家的引用。連起來形成一條鏈。待處理對象則傳到此鏈上,在此鏈進行傳遞,且待處理對象並不知道此會被鏈上的哪個對象處理,這使得我們能夠動態的添加鏈上的對象而且分配責任。
純責任鏈和非純責任鏈
責任鏈分為兩種。純責任鏈和非純責任鏈。
純責任鏈是待處理對象request在處理對象handler鏈上傳遞,每一個處理對象handler處理request的一部分,到終於處理完畢。非純責任鏈則是待處理對象request在處理對象handler鏈上傳遞,每一個處理對象handler要麽把request拿出來所有處理。要不就不處理。留給下一個handler。
實現(非純責任鏈):
場景:
必須滿足一定的條件時處理對象(handler)才幹處理待處理對象(request)。否則在責任鏈中傳遞下去,代碼中我用的是能力值abilityToValue,handler滿足能力值大於request就可以處理。否則在責任鏈中傳遞下去。
Handler.java
/**
* Created by wwh on 15-7-30.
*/
public abstract class Handler {
/* 能力值 */
protected int abilityToValue = 0;
/* 持有下一個對象的引用 */
protected Handler nextHandler;
/* 詳細的處理方法 */
public abstract void handleRequest(int vaule);
/* 得到下一個對象的引用 */
public Handler getNextHandler(){
if(nextHandler != null) {
return nextHandler;
}
else{
/* 到達責任鏈末尾。未能處理 */
System.out.println("該待處理對象被責任鏈放過..." );
}
return null;
}
/* 設置後繼的處理對象 */
public void setNextHandler(Handler nextHandler){
if(nextHandler != null) {
this.nextHandler = nextHandler;
}else{
System.out.println("到達末尾,設置完畢責任鏈");
}
}
}
class HandlerRequest_one extends Handler{
/* 設置能力值 */
HandlerRequest_one(int atv){
this.abilityToValue = atv;
}
/* 詳細的處理請求方法 */
@Override
public void handleRequest(int value) {
/* 假設處理對象的能力值在100-200範圍內。那麽處理此請求,
否則沒有能力處理此請求,交給下一個handler */
if(abilityToValue > value){
System.out.println("HandlerRequest_one 處理請求");
}else{
System.out.println("HandlerRequest_one 放過請求。傳遞給下一個Handler");
if(getNextHandler() != null)
getNextHandler().handleRequest(value);
}
}
}
class HandlerRequest_two extends Handler{
/* 設置能力值 */
HandlerRequest_two(int atv){
this.abilityToValue = atv;
}
@Override
public void handleRequest(int value) {
/* 假設處理對象的能力值在200-400範圍內,那麽處理此請求,
* 否則沒有能力處理此請求,交給下一個handler */
if(abilityToValue > value){
System.out.println("HandlerRequest_two 處理請求");
}else{
System.out.println("HandlerRequest_two 放過請求。傳遞給下一個handler");
if(getNextHandler() != null)
getNextHandler().handleRequest(value);
}
}
}
request.java
/**
* Created by wwh on 15-7-30.
*/
public class Request {
public int ablity;
Request(int ablity){ this.ablity = ablity; }
public static void main (String[] args) throws Exception{
Handler hd1 = new HandlerRequest_one(100);
Handler hd2 = new HandlerRequest_two(500);
hd1.setNextHandler(hd2);
/* 情況1 */
Request req1 = new Request(50);
hd1.handleRequest(req1.ablity);
System.out.println("-------------------------");
/* 情況2 */
Request req2 = new Request(300);
hd1.handleRequest(req2.ablity);
System.out.println("-------------------------");
/* 情況3 */
Request req3 = new Request(500);
hd1.handleRequest(req3.ablity);
}
}
結果:
責任鏈模式在java中應用非常多,除了近期在看的netty中的Pipeline,還有Servlet中的過濾器(Filter),Struts2的攔截器(Interceptor)。
長處and缺點:
長處:
請求者與處理者代碼分離:減少了耦合度。
缺點:責任鏈像一條鏈表一樣,效率可能會有問題。不能保證請求一定被收到
貼張網上圖片
java 設計模式 -- 責任鏈模式