java设计模式---责任链模式(Responsibility)

java设计模式---责任链模式(Responsibility)

模拟请求对象 Request

package laona;

/**
 * 模拟请求对象
 */
public class Request {
   // 简单封装一种字符串类型
    private String requestString;

    public Request (String message) {
        this.requestString = message;
    }

    public String getRequestString() {
        return requestString;
    }

    public void setRequestString(String requestString) {
        this.requestString = requestString;
    }
}

模拟Response对象

package laona;

/**
 * 模拟响应对象
 */
public class Response {

    private String responseString;

    public Response (String message) {
        this.responseString = message;
    }

    public String getResponseString() {
        return responseString;
    }

    public void setResponseString(String responseString) {
        this.responseString = responseString;
    }
}

定义 Filter接口

package laona;

/**
 * 责任链模式  请求正序  响应倒序 通过过滤器
 */
public interface Filter {

    /**
     * doFilter();
     * 即过滤 request 又要过滤 response
     * @param request
     * @param response
     * @return
     */
    void doFilter(Request request, Response response, FilterChain chain);

}

定义FilterChain接口

package laona;

import java.util.ArrayList;
import java.util.List;

public class FilterChain implements Filter {

    private Integer index = 0;

    /**
     * 定义一个list集合用于存取Filter
     */
    private List<Filter> filterList = new ArrayList<>();

    /**
     * 向集合中添加数据
     * @param filter
     * @return
     */
    public FilterChain addFilter (Filter filter) {
        filterList.add(filter);
        return this;
    }

    /**
     * 从集合中添加元素
     * @param filter
     * @return
     */
    public FilterChain deleteFilter (Filter filter) {

        filterList.remove(filter);
        return this;
    }
    public List<Filter> getFilterList() {
        return filterList;
    }
    /**
     * 实现接口Filter中的doFilter方法
     * @param request
     * @param response
     */
    @Override
    public void doFilter(Request request, Response response, FilterChain chain) {

        // 没有filter
        if (index == filterList.size()) {
            return;
        }
        Filter filter = filterList.get(index);
        index ++;

        filter.doFilter(request, response, chain);
    }
}
自定义过滤器-1
package laona;

/**
 * html 自定义过滤器
 */
public class HTMLFilter implements Filter {


    /**
     * 将<html>转换成[html]
     * @param request
     * @param response
     */
    @Override
    public void doFilter (Request request, Response response, FilterChain chain) {

        // 处理request
        request.getRequestString().replace("<", "{")
                .replace(">","]" );

        System.out.println("---> request HTMLFilter <---");
        // 进入下一个filter
        chain.doFilter(request, response, chain);
        // 处理response
        response.getResponseString().replace("", "");
        System.out.println("---> response HTMLFilter <---");
    }
}

自定义过滤器-2

package laona;

/**
 * 去除空格 过滤器
 */
public class NullFilter implements Filter {


    @Override
    public void doFilter (Request request, Response response, FilterChain chain) {

        // 处理request
        request.setRequestString(request.getRequestString().replaceAll(" ", ""));

        System.out.println("---> request NullFilter <---");

        chain.doFilter(request, response, chain);
        // 处理response
        response.getResponseString().replace("", "");
        System.out.println("---> response NullFilter <---");
    }
}

自定义过滤器-3

package laona;

/**
 * BadLanguageFilter 过滤器
 */
public class BadLanguageFilter implements Filter {

    /**
     * 将和尚等字符转换成*
     * @param request
     * @param response
     */
    @Override
    public void doFilter (Request request, Response response, FilterChain chain) {

        // 处理request
        request.setRequestString(request.getRequestString().replace("和尚", "*"));

        System.out.println("---> reques BadLanguageFilter <---"); chain.doFilter(request, response, chain);

    
// 处理response
    response.getResponseString().replace("", ""); System.out.println("---> response BadLanguageFilter <---"); } }

测试类

package laona;

import org.junit.Test;

/**
 * 责任链模式 测试类
 */
public class ResponsibilityTest {

    
    @Test
    public void responsibilityTest01 () {

        String message = "woshi 老衲,<html>,你是哪个和尚?";

        FilterChain filterChain = new FilterChain();

        Request request = new Request(message);
        Response response = new Response(message);

        filterChain.addFilter(new NullFilter()).addFilter(new BadLanguageFilter()).addFilter(new HTMLFilter());

        filterChain.doFilter(request, response, filterChain);

        System.out.println(request.getRequestString());
        System.out.println(response.getResponseString());
    }
}

测试结果

 

以上代码很简单,关键在于思想的提炼.

 

 

posted @ 2018-07-08 15:29  -老衲-  阅读(480)  评论(0编辑  收藏  举报