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

來源:互聯網
上載者:User

標籤:設計模式   java   

設計模式 – 責任鏈模式 介紹:

責任鏈模式是一種動態行為模式,有多個對象,每個對象分別擁有其下家的引用,連起來形成一條鏈,待處理對象則傳到此鏈上,在此鏈進行傳遞,且待處理對象並不知道此會被鏈上的哪個對象處理,這使得我們可以動態增加鏈上的對象並且分配責任。

純責任鏈和非純責任鏈

責任鏈分為兩種,純責任鏈和非純責任鏈。
純責任鏈是待處理對象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 設計模式 -- 責任鏈模式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.