1、概念理解
舉例說明:一家三輩(兒子,父親,爺爺),去幫助一個一個小學一年級的學生解決一道數學題,這個小學生請求幫助,他就是請求者,兒子先幫忙,兒子不行父親上,父親不行爺爺上,爺爺不行那就gg,小學生這個請求者不知道誰能做出來,這種情況就是責任鏈。
職責鏈模式(Chain of Responsibility):使多個對象都有機會處理同一個請求,從而避免請求的發送者和接收者之間的耦合關係。將這些對象連成一條鏈,並沿着這條鏈傳遞該請求,直到有一個對象處理它爲止。
2、應用場景
1、我們經常的if else判斷就可以這樣,順序執行可以考慮,我們可以考慮這種模式,當然策略模式也是可以的, 2、公司準備做一個請假制度,孕婦可以請9天,喜事3天,喪事6天等等這種if else的判斷,我們也可以用到責任鏈模式 不過這種模式一般很少見到,不過有一處我們體會過,Tomcat中的Filter就是使用了責任鏈模式,創建一個Filter除了要在web.xml文件中做相應配置外,還需要實現javax.servlet.Filter接口。
3、代碼實現
public class Level { private int level = 0; public Level(int level) { this.level = level; } public int getLevel() { return level; } public boolean above(Level level) { if(this.level >= level.getLevel()) { return true; }else { return false; } } }
public class Request { Level level; public Request(Level level) { System.out.println("開始請求..."); this.level = level; } public Level getLevel() { return level; } }
public class Response { private String message; public Response(String message) { System.out.println("處理完請求"); this.message = message; } public String getMessage() { return message; } }
public abstract class Handler { private Handler nextHandler = null; public void setNextHandler(Handler handler){ this.nextHandler = handler; } protected abstract Level getHandlerLevel(); public abstract Response response(Request request); public final Response handlerRequest(Request request){ Response response = null; if (this.getHandlerLevel().above(request.level)){ response = this.response(request); }else { if (nextHandler.nextHandler != null){ response = this.nextHandler.handlerRequest(request); }else { System.out.println("沒有能夠滿足條件的"); } } return response; } }
public class ConcreteHandler1 extends Handler { @Override protected Level getHandlerLevel() { return new Level(1); } @Override public Response response(Request request) { System.out.println("該請求由 ConcreteHandler1 處理"); return new Response("響應結果 1"); } }
public class ConcreteHandler2 extends Handler { @Override protected Level getHandlerLevel() { return new Level(2); } @Override public Response response(Request request) { System.out.println("該請求由 ConcreteHandler2 處理"); return new Response("響應結果 2"); } }
public class ConcreteHandler3 extends Handler { @Override protected Level getHandlerLevel() { return new Level(3); } @Override public Response response(Request request) { System.out.println("該請求由 ConcreteHandler3 處理"); return new Response("響應結果 3"); } }
public class HandlerUtil { public static void handle(int level){ Handler ch1 = new ConcreteHandler1(); Handler ch2 = new ConcreteHandler2(); Handler ch3 = new ConcreteHandler3(); ch1.setNextHandler(ch2); ch2.setNextHandler(ch3); Response res1 = ch1.handlerRequest(new Request(new Level(level))); if (res1 != null) { System.out.println(res1.getMessage()); } } }
main函數
public class Main { public static void main(String[] args){ HandlerUtil.handle(2); System.out.println("-------------"); HandlerUtil.handle(4); } }
結果
其實,總感覺還不如用策略模式或者直接寫if else呢,雖然if else的缺點是代碼臃腫,耦合度高,而這個責任鏈設計模式是靈活性比較高,但是寫完這個博客沒感覺出來,大家還是知道有這麼一個模式就好,畢竟你現在有了疑問,將來說不定碰到一個大神,會指點你的。