Okhttp源码应用到的责任链模式

前言

最近在看OkHttp源码,在整个OkHttp中最重要也是最核心的就是拦截器了,简单看拦截器似乎就是一个个实现Interceptor接口的类,再分别在类中实现相应的逻辑,直到我看到下面的代码

    private Response getResponseWithInterceptorChain() throws IOException {
     // Build a full stack of interceptors.
     List<Interceptor> interceptors = new ArrayList<>();
      interceptors.addAll(client.interceptors());
     interceptors.add(retryAndFollowUpInterceptor);
     interceptors.add(new BridgeInterceptor(client.cookieJar()));
     interceptors.add(new CacheInterceptor(client.internalCache()));
      interceptors.add(new ConnectInterceptor(client));
      if (!retryAndFollowUpInterceptor.isForWebSocket()) {
        interceptors.addAll(client.networkInterceptors());
    }
    interceptors.add(new CallServerInterceptor(
    retryAndFollowUpInterceptor.isForWebSocket()));

    Interceptor.Chain chain = new RealInterceptorChain  (
        interceptors, null, null, null, 0, originalRequest);
    return chain.proceed(originalRequest);
 }

上述代码中加入了很多个拦截器,这么多拦截器是怎么一个个实现的?

责任链模式

责任链模式将各个拦截器连接环环相扣,最终完成一次网络请求。


一个例子说明责任链应用场景

public class BrowRequest {
    private int requestMoney;

    public BrowRequest(int money) {
        System.out.println("有新请求,需要借款" + money + "元");
        requestMoney = money;
    }

    public int getRequestMoney() {
        return requestMoney;
    }
}

最核心的类, 处理类,注意this.superior.approveRequest(browRequest);简单看似乎是自己调自己的方法,其实不然,这句代码将处理交给了下一个对象setSuperior()这个方法就是设置下一个传递对象,类似击鼓传花,将花递给了下一个

abstract class AbstractClerk {
    private AbstractClerk superior = null;
    protected String type;
    public abstract int getLimit();

    public void setSuperior(AbstractClerk superior) {
        this.superior = superior;
    }

    public void approveRequest(BrowRequest browRequest) {
        if (getLimit() >= browRequest.getRequestMoney()) {
            System.out.println(getType() + "同意借款请求");
        } else {
            if (this.superior != null) {
                //传递给下一个使用
                this.superior.approveRequest(browRequest);
            } else {
                System.out.println("没有人能够同意借款请求");
            }
        }
    }

    public String getType() {

        return type;

    }
}

接着就比较简单了,定义我们的具体类,继承处理类

public class Clerk extends AbstractClerk {

    public Clerk() {
        super.type = "职员";
    }

    @Override
    public int getLimit() {
        return 5000;
    }
}


public class Leader extends AbstractClerk {
    public Leader() {
        super.type = "组长";
    }

    @Override
    public int getLimit() {
        return 20000;
    }
}


public class Manager extends AbstractClerk {
    public Manager() {
        super.type = "经理";
    }

    @Override
    public int getLimit() {
        return 100000;
    }
}

最后在客户端调用下就行了

    public class Client {
    public static void main(String[] args) {
        AbstractClerk clerk = new Clerk();
        AbstractClerk leader = new Leader();
        AbstractClerk manager = new Manager();

        clerk.setSuperior(leader);
        leader.setSuperior(manager);


        //有人借款10000元
        clerk.approveRequest(new BrowRequest(10000));

        //有人借款111000元
        clerk.approveRequest(new BrowRequest(100000));
    }
}

可以看到责任链跟现实生活中的击鼓传花游戏非常相似,很多对象由每一个对象对其下家的引用而连接起来形成一条链。

最核心的方法是处理类, 一般处理类会包含一个指向下一处理类的成员变量,和一个处理请求的方法 , 如果符合条件就自己处理,否则就传递给下一个处理。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容