设计模式-责任链

这边帖子的主要思路来自于马士兵老师的设计模式课程。

这边模拟了tomcat的filter,代码如下。

1、首先定义一个Filter接口

package com.wry.chain;

/**
 * @author rongyao wen
 * @date 2018/7/30
 */
public interface Filter {
    public void doFilter(Request request, Response response, FilterChain chain);
}

2、定义FilterChain,用来保存filter实例

package com.wry.chain;

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

/**
 * @author rongyao wen
 * @date 2018/7/30
 */
public class FilterChain implements Filter {
    List<Filter> list = new ArrayList<>();
    int index;

    public void addFilter(Filter f) {
        list.add(f);
    }


    @Override
    public void doFilter(Request request, Response response, FilterChain chain) {
        if (index == list.size()) {
            new Servlet().doService(request, response);
            return;
        }
        Filter f = list.get(index);
        index++;
        f.doFilter(request, response, chain);

    }
}

3、加入两个filter实例

package com.wry.chain;

/**
 * @author rongyao wen
 * @date 2018/7/30
 */
public class FilterOne implements Filter {
    @Override
    public void doFilter(Request request, Response response, FilterChain chain) {
        System.out.println("第一个过滤器开始");
        chain.doFilter(request, response, chain);
        System.out.println("第一个过滤器结束");
    }
}
package com.wry.chain;

/**
 * @author rongyao wen
 * @date 2018/7/30
 */
public class FilterTwo implements Filter {
    @Override
    public void doFilter(Request request, Response response, FilterChain chain) {
        System.out.println("第二个过滤器开始");
        chain.doFilter(request, response, chain);
        System.out.println("第二个过滤器结束");
    }
}

4、请求对象和响应对象

package com.wry.chain;

/**
 * @author rongyao wen
 * @date 2018/7/30
 */
public class Request {
    private String str;

    public String getStr() {
        return str;
    }

    public void setStr(String str) {
        this.str = str;
    }
}
package com.wry.chain;

/**
 * @author rongyao wen
 * @date 2018/7/30
 */
public class Response {
    private String str;

    public String getStr() {
        return str;
    }

    public void setStr(String str) {
        this.str = str;
    }
}

5、Servlet对象

package com.wry.chain;

/**
 * @author rongyao wen
 * @date 2018/7/30
 */
public class Servlet {
    public void doService(Request request, Response response) {
        System.out.println("请求接收信息:" + request.getStr());
        response.setStr("服务器端发送信息");
    }
}

其中request,response,servlet都只是以最简单的方式模拟了一下

6、测试程序

package com.wry.chain;

/**
 * @author rongyao wen
 * @date 2018/7/30
 */
public class Main {
    public static void main(String args[]) {
        Request request = new Request();
        request.setStr("请求数据");
        Response response = new Response();
        FilterChain filterChain = new FilterChain();
        filterChain.addFilter(new FilterOne());
        filterChain.addFilter(new FilterTwo());
        filterChain.doFilter(request, response, filterChain);
        System.out.print("客户端接收服务器端:" + response.getStr());
    }
}

7、结果如下

8、sequence图调用详细图如下示

猜你喜欢

转载自blog.csdn.net/wrongyao/article/details/81289041