前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式(十四)责任链模式

设计模式(十四)责任链模式

作者头像
乐百川
发布2018-01-08 18:27:22
5350
发布2018-01-08 18:27:22
举报

前面讨论了创建型模式、结构型模式,今天我们来讨论一下行为型模式。责任链模式,就是我们讨论的第一种行为型模式。责任链模式具体不容易说出来,但是如果看一看责任链模式的实际例子就很容易明白了。最典型的例子就是Java EE Servlet中的过滤器,以链式方式对请求进行过滤了。当我们遇到类似需求的时候,也可以使用责任链模式来解决。

下面我们来模拟一下Java Servlet中的Filter。首先,需要请求和响应的接口和实现。这两个接口都很简单。

//请求
public interface Request {
    String getMessage();
}

class RequestImpl implements Request{
private String msg;

    public RequestImpl(String msg) {
        this.msg = msg;
    }

    @Override
    public String getMessage() {
        return msg;
    }
}

//响应
public interface Response {
    String getMessage();
}

class ResponseImpl implements Response {
    private String msg;

    public ResponseImpl(String msg) {
        this.msg = msg;
    }

    @Override
    public String getMessage() {
        return msg;
    }
}

之后是过滤器的接口和实现。过滤器将会对请求和处理进行处理和过滤。过滤器1和2是正常的过滤器,过滤之后还会继续调用链上的其它过滤器。而过滤器3则会直接阻断链。

public interface Filter {
    void doFilter(Request request, Response response, FilterChain chain);
}

class FilterImpl1 implements Filter {

    @Override
    public void doFilter(Request request, Response response, FilterChain chain) {
        System.out.println("In filter1: " + request.getMessage() + ":" + response.getMessage());
        chain.doFilter(request, response);
    }
}

class FilterImpl2 implements Filter {

    @Override
    public void doFilter(Request request, Response response, FilterChain chain) {
        System.out.println("In filter2: " + request.getMessage() + ":" + response.getMessage());
        chain.doFilter(request, response);
    }
}

class FilterImpl3 implements Filter {

    @Override
    public void doFilter(Request request, Response response, FilterChain chain) {
        System.out.println("In filter3: " + request.getMessage() + ":" + response.getMessage());
    }
}

下面来实现责任链。责任链其实和很简单,开始过滤之后,责任链就会不断的调用链上的过滤器,直到某个过滤器判断不需要继续过滤(例如过滤器3)或者链到头为止。为了让这个链能够复用,我还添加了当前调用链的标记current,标记调用到哪里了,再到头之后重新将current设置为0。

class FilterChain {
    private List<Filter> filters;
    private int current;

    public FilterChain(List<Filter> filters) {
        this.filters = filters;
        current = 0;
    }

    void doFilter(Request request, Response response) {
        if (current <= filters.size() - 1) {
            Filter currentFilter = filters.get(current);
            current++;
            currentFilter.doFilter(request, response, this);
        } else {
            current = 0;
        }
    }
}

这样一个责任链就完成了。我们来调用一下。

    public void run() {
        Filter filter1 = new FilterImpl1();
        Filter filter2 = new FilterImpl2();
        List<Filter> filters = new ArrayList<>();
        filters.add(filter1);
        filters.add(filter2);
        FilterChain chain = new FilterChain(filters);

        Request request = new RequestImpl("request1");
        Response response = new ResponseImpl("response1");

        chain.doFilter(request, response);
        System.out.println();

        filters.add(0,new FilterImpl3());
        chain.doFilter(request, response);
    }

结果应该类似这样。和我们的预期相同。

责任链模式
In filter1: request1:response1
In filter2: request1:response1

In filter3: request1:response1
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年03月29日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档