1. 程式人生 > >設計模式—責任鏈模式

設計模式—責任鏈模式

[] .com repl ring replace servlet 就業 返回 array

責任鏈將處理請求在鏈條的節點上傳遞,每到一個節點可被處理或者也可不被處理。

典型的是在servlet中過濾器filter的的處理方式。當request請求或者response請求時,請求經過過濾鏈上的節點後,又進入下一個節點,直到鏈尾。

下面以模仿servlet中filter的處理方式(馬士兵老師設計模式講解內容):

1.過濾器接口

package com.bjsxt.dp.filter;
public interface Filter {
    void doFilter(Request request, Response response, FilterChain chain);
}

2.過濾器鏈

package com.bjsxt.dp.filter;
import java.util.ArrayList;
import java.util.List;

public class FilterChain implements Filter {
    List<Filter> filters = new ArrayList<Filter>();
    int index = 0;
    
    public FilterChain addFilter(Filter f) {
        this.filters.add(f);
        return
this; } @Override public void doFilter(Request request, Response response, FilterChain chain) { if(index == filters.size()) return ; Filter f = filters.get(index); index ++; f.doFilter(request, response, chain); } }

3.過濾鏈_1

package com.bjsxt.dp.filter;
public class HTMLFilter implements Filter { @Override public void doFilter(Request request, Response response, FilterChain chain) { //process the html tag <> request.requestStr = request.requestStr.replace(<, [) .replace(>, ]) + "---HTMLFilter()"; chain.doFilter(request, response, chain); response.responseStr += "---HTMLFilter()"; } }

4.過濾器_2

package com.bjsxt.dp.filter;
public class SesitiveFilter implements Filter {

    @Override
    public void doFilter(Request request, Response response, FilterChain chain) {
        request.requestStr = request.requestStr.replace("被就業", "就業")
         .replace("敏感", "") + "---SesitiveFilter()";
        chain.doFilter(request, response, chain);
        response.responseStr += "---SesitiveFilter()";    
    }    
}

5.request請求

package com.bjsxt.dp.filter;
public class Request {
    String requestStr;
    public String getRequestStr() {
        return requestStr;
    }
    public void setRequestStr(String requestStr) {
        this.requestStr = requestStr;
    }
}

6.response請求

package com.bjsxt.dp.filter;
public class Response {
    String responseStr;
    public String getResponseStr() {
        return responseStr;
    }
    public void setResponseStr(String responseStr) {
        this.responseStr = responseStr;
    }
    
}

7.客戶端請求

package com.bjsxt.dp.filter;
public class Main {
    /**
     * @param args
     */
    public static void main(String[] args) {
        String msg = "大家好:),<script>,敏感,被就業,網絡授課沒感覺,因為看不見大家夥兒";
        Request request = new Request();
        request.setRequestStr(msg);
        Response response = new Response();
        response.setResponseStr("response");
        FilterChain fc = new FilterChain();
        fc.addFilter(new HTMLFilter())
          .addFilter(new SesitiveFilter())
          ;      
        fc.doFilter(request, response, fc);
        System.out.println(request.getRequestStr());
        System.out.println(response.getResponseStr());
    }

}

FilterChain中創建了一個過濾鏈,記錄了有多少個過濾器,並且遞歸調用doFilter,經過一個過濾器後就走下一個過濾器,直到鏈尾。在遞歸返回的時候接著對response處理,處理的順序和request

的順序相反。

過濾鏈處理之後結果:

技術分享

設計模式—責任鏈模式