责任链模式

2018-12-26  本文已影响1人  那年23

概念

  说到责任链模式,我就想起了okHttp中设置拦截器的时候了,今年、中外、开花,关注。
  其实责任链就是将多个处理连接成一条链,然后处理一个对象,正常点的解释:使多个对象都有机会处理同一个请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

角色

抽象责任:定义了具体的操作方式。
具体责任:实现了抽象责任中的方法。
处理类:实现抽象责任接口,存储具体责任并完成调用。

Code、Code

  这里简单的模仿了一下okHttp的拦截器链。

首先是Request和Response
public class Request {
    private String requestStr;

    public String getRequestStr() {
        return requestStr;
    }

    public void setRequestStr(String requestStr) {
        this.requestStr = requestStr;
    }

}
public class Response {
    private String responseStr;

    public String getResponseStr() {
        return responseStr;
    }

    public void setResponseStr(String responseStr) {
        this.responseStr = responseStr;
    }

}

抽象责任:
public interface Filter {
    Response doFilter(Request request, Response response, FileterChain chain);
}
具体责任链(拦截器A、B)
public class AFilter implements Filter{

    @Override
    public Response doFilter(Request request, Response response, FileterChain chain) {
        Response newResponse = new Response();
        newResponse.setResponseStr(response.getResponseStr().replace("<>", ""));
        return newResponse;
    }

}

public class BFilter implements Filter {

    @Override
    public Response doFilter(Request request, Response response, FileterChain chain) {
        Response newResponse = new Response();
        newResponse.setResponseStr(response.getResponseStr().replace("33", "55"));
        return newResponse;
    }

}
责任链

   这里用List存放了具体的责任(拦截器),然后实现了传递。

public class FileterChain implements Filter {

    private List<Filter> filters = new ArrayList();

    private Response resultResponse;

    public FileterChain addFilter(Filter filter) {
        filters.add(filter);
        return this;
    }

    @Override
    public Response doFilter(Request request, Response response, FileterChain chain) {
        resultResponse = response;
        for (int i = 0; i < filters.size(); i++) {
            resultResponse = filters.get(i).doFilter(request, resultResponse, chain);
        }
        System.out.println(resultResponse.getResponseStr());
        return resultResponse;
    }

}
客户端测试类
public class Client {
    public static void main(String[] args) {
        String responseStr = "444<>33";
        Response response = new Response();
        response.setResponseStr(responseStr);
        
        FileterChain fc = new FileterChain()
                .addFilter(new AFilter())
                .addFilter(new BFilter());
        fc.doFilter(new Request(), response, fc);
    }
}
result
after that

  在okHttp中,intercepter接口如下:

public interface Interceptor {
  Response intercept(Chain chain) throws IOException;

  interface Chain {
    Request request();

    Response proceed(Request request) throws IOException;

    @Nullable Connection connection();
  }
}

这里面可以利用Chain获取request和response,而我的例子是把request和response分开的,其实可以抽象出一个BaseRequest和BaseResponse。而且我的举例中并没有用到Request。但是责任链模式还是这个流程

The End

优点:实现了请求和处理的分离。
缺点:每次都从链头开始调用。

我觉得学会了这些设计模式对看源码是非常有帮助的,至少能知道他们的大概实现思想。

上一篇 下一篇

猜你喜欢

热点阅读