1. 程式人生 > >java 設計模式 -- 責任鏈模式

java 設計模式 -- 責任鏈模式

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 設計模式 -- 責任鏈模式