熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java高級技術 >> 正文

Java設計模式:責任鏈

2013-11-23 19:44:42  來源: Java高級技術 


    責任鏈模式(Chain of Responsibility)的目標是使多個對象都有機會處理請求從而避免請求的發送者和接收者之間的耦合關系將這些對象連成一條鏈並沿著這條鏈傳遞請求直到有一個對象處理它為止
    在處理用戶的請求時可能要根據不同的情況對請求添加不同的處理邏輯在這時候就可以利用責任鏈進行設計當需要添加一個處理邏輯時可以很方便的添加一個處理的節點
    現在我們的需求是處理用戶的請求將用戶提交的字符串信息進行層層處理同時在處理完成之後返回結果時也要對返回的字符串進行層層處理而處理返回的情況時其處理的順序和先前是正好相反的順序
    首先建立用戶的請求和接收對象Request和Response

  


    package comlcqfilter;  
     
    public class Request {  
        String requestStr;  
     
        public String getRequestStr() {  
            return requestStr;  
        }  
     
        public void setRequestStr(String requestStr) {  
            thisrequestStr = requestStr;  
        }  
     
    }  

  


    package comlcqfilter;  
     
    public class Response {  
        String responseStr;  
     
        public String getResponseStr() {  
            return responseStr;  
        }  
     
        public void setResponseStr(String responseStr) {  
            thisresponseStr = responseStr;  
        }  
     
    }  

  我們將處理用戶信息的邏輯抽象成為一個個的過濾器進一步抽象出過濾器接口Filter

  


    package comlcqfilter;  
     
    public interface Filter {  
        public void doFilter(Request request Response responseFilterChain chain);  
     
    }  

  注意在Filte接口中doFilter方法參數中有FilterChain的一個變量我們再建立FilterChain類

  


    package comlcqfilter;  
     
    import javautilArrayList;  
    import javautilList;  
     
    public class FilterChain implements Filter {  
        List<Filter> filters = new ArrayList<Filter>();  
        int index = ;  
     
        public FilterChain addFilter(Filter f) {  
            thisfiltersadd(f);  
            return this;  
        }  
     
        @Override 
        public void doFilter(Request request Response response FilterChain chain) {  
            if (index == filterssize())  
                return;  
            Filter f = filtersget(index);  
            index++;  
            fdoFilter(request response chain);  
        }  
    }  

  在FilterChain中繼承了Filter接口從而實現了doFilter方法在FilterChain中又有一個index變量該變量是用來標記當前訪問的是哪一個過濾器這些過濾器是存放在ArrayList中的這樣用戶在使用的時候就可以實現自己的過濾器編寫自己的處理邏輯從而將自己的過濾器添加到ArrayList中再調用FilterChain的doFilter方法遍歷整個責任鏈

  下面我們編寫三個過濾器

  HTMLFilter類

  


    package comlcqfilter;  
     
    /**  
     * 過濾HTML中的腳本元素  
     * @author lcq  
     *  
     */ 
    public class HTMLFilter implements Filter {  
     
        @Override 
        public void doFilter(Request request Response responseFilterChain chain) {  
            requestrequestStr = requestgetRequestStr()replace(< [)  
                    replace(> HTMLFilter);  
            chaindoFilter(request response chain);  
            responseresponseStr += HTMLFilter;  
              
        }  
     
    }  

  SesitiveFilter類

  


    package comlcqfilter;  
     
    public class SesitiveFilter implements Filter {  
     
        @Override 
        public void doFilter(Request request Response response FilterChain chain) {  
            requestrequestStr = requestgetRequestStr()replace(敏感   )  
                    replace(貓貓 hahaSesitiveFilter);  
            chaindoFilter(request response chain);  
            responseresponseStr += SesitiveFilter;  
     
        }  
     
    }  

  FaceFilter類

  


    package comlcqfilter;  
     
    public class FaceFilter implements Filter {  
     
        @Override 
        public void doFilter(Request request Response response FilterChain chain) {  
            requestrequestStr = requestgetRequestStr()replace(:)  
                    ^V^FaceFilter);  
            chaindoFilter(request response chain);  
            responseresponseStr += FaceFilter;  
     
        }  
     
    }  

  最後編寫測試類

  


    package comlcqfilter;  
     
    public class Main {  
        public static void main(String[] args) {  
            String message = 敏感詞匯重慶<script> 躲貓貓 :);  
            Request request = new Request();  
            requestsetRequestStr(message);  
            Response response = new Response();  
            responsesetResponseStr(response);  
            FilterChain fc = new FilterChain();  
            fcaddFilter(new HTMLFilter())addFilter(new SesitiveFilter());  
     
            FilterChain fc = new FilterChain();  
            fcaddFilter(new FaceFilter());  
            fcaddFilter(fc);  
            fcdoFilter(request responsefc);  
            Systemoutprintln(request =  + requestgetRequestStr());  
            Systemoutprintln(response =  + responsegetResponseStr());  
        }  
     
    }  

  在上面的實例中應該注意兩個地方

  我們建立的FilterChain中繼承了Filter接口所以在測試類中就可以像使用其他的過濾器一樣使用FilterChain大大提高了靈活性

  對於實現責任鏈的訪問處理順序問題該問題的解決使用的是遞歸的思想從而使先調用的結點在處理返回結果時其調用過濾器的順序是相反的這種解決方案在Struts和其他框架中實現過濾器和攔截器使用的較為普遍並且十分巧妙


From:http://tw.wingwit.com/Article/program/Java/gj/201311/27381.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.