責任鏈模式 java
優勢:
•責任鏈模式下降了請求的發送端和接收端之間的耦合,使多個對象都有機會處理這個請求。
•因爲是在客戶端來定義責任鏈的結構,能夠動態地增長或修改處理一個請求的結構,加強了給對象指派職責的靈活性。
缺點:
•責任鏈模式通常是從鏈子的開頭位置進行遍歷,找到時候的處理對象,對性能有必定的損耗。
適用場合:
•有多個的對象能夠處理一個請求,哪一個對象處理該請求運行時刻自動肯定。
•想在不明確指定接收者的狀況下,向多個對象中的一個提交一個請求。
•可處理一個請求的對象集合應被動態指定。
•當一個方法的傳入參數將成爲分支語句的判斷條件,分支條件存在擴展的可能,每個分支的職責相對獨立,且邏輯較爲複雜時。 ide
與狀態模式的區別:
責任鏈模式注重責任的傳遞,而且責任鏈由客戶端進行配置,具體的操做對象維護了一下後繼者的引用(由客戶端配置),若是本身可以處理,則處理,不能處理調用後繼者處理。 性能
狀態模式注重對象狀態的轉換,這個轉換過程對客戶端是透明的。重點是把狀態的判斷邏輯封裝在「表示不一樣狀態的一系列類中」具體的操做完成後,修改被操做這的狀態,這個狀態的修改對客戶端是透明的。 this
package com.perfecking.base; import java.util.LinkedList; import java.util.List; public class ChainOfResponsibility { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub FilterChain chain = new FilterChain(); chain.addFiler(new AuthFilter()); chain.addFiler(new LoginFilter()); chain.doFilter(new Request(), new Response()); } } class Request{ private String reqMsg = null; public String getMsg(){ return reqMsg; } public void setMsg(String reqMsg){ this.reqMsg = reqMsg; } } class Response{ private String respMsg = null; public String getMsg(){ return respMsg; } public void setMsg(String respMsg){ this.respMsg = respMsg; } } class FilterChain{ private List<Filter> filters = new LinkedList<>(); private int index = 0; public void addFiler(Filter filter){ filters.add(filter); } public void doFilter(Request request,Response response){ if(index==filters.size()){ return; } Filter filter = filters.get(index++); filter.doFilter(request, response, this); } } interface Filter{ public void doFilter(Request request,Response response,FilterChain chain); } class AuthFilter implements Filter{ @Override public void doFilter(Request request, Response response, FilterChain chain) { // TODO Auto-generated method stub if(request.getMsg().contains("perfecking")){ response.setMsg("allowed visit."); } chain.doFilter(request, response); } } class LoginFilter implements Filter{ @Override public void doFilter(Request request, Response response, FilterChain chain) { // TODO Auto-generated method stub } }
PS:
•純責任鏈模規定一個具體的處理對象只能對請求做出處理請求或傳給後繼者兩種動做,不能出現處理了一部分,把剩下的傳給後繼者處理的狀況,並且請求在責任鏈中必須被處理。然而責任鏈模的思想在於,經過將多個處理對象創建關聯,來達到請求與具體的某個處理者的解耦。因此在實際的需求中不必定非要達到一種純責任鏈模式的設計。
•責任鏈模式並不建立責任鏈。責任鏈的建立必須由系統的其它部分建立出來。
•責任鏈能夠是一個鏈能夠是一條線,一個樹,也能夠是一個環。
•GoF規定一個請求必須被某一個處理者對象所處理,因此爲了不一個請求有可能到了鏈的末端都得不處處理,或者由於沒有正確配置而得不處處理,能夠提供一個默認處理全部請求的對象。 spa