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