談談 OkHttp 對責任鏈模式的巧妙應用

2021-08-03 22:40:41 字數 1646 閱讀 9397

3. 基本流程

aop 程式設計。每次的 proceed 是執行點,可以在執行點的前面和後面新增需要的業務邏輯。比如打打日誌,失敗重試,新增快取等等

***就是基於責任鏈模式,每個節點有自己的職責,同時可以選擇是否把任務傳遞給下乙個環節

***的設計,可以像工廠流水線一樣,傳遞使用者發起的請求 request,每乙個***完成相應的功能,從失敗重試和重定向實現、請求頭的修改和cookie 的處理,快取的處理,建立 tcp 和 ssh 連線,傳送 request 和讀取 response,每乙個環節由專門的 interceptor 負責

主要方法intercept。會傳遞乙個 chain 物件過來,可以在 chain 在執行proceed的前後新增**

主要方法proceed。okhttp 的唯一實現類是 realinterceptorchain。內部維護了所有要執行的***列表,在proceed內部會喚醒下乙個 interceptor ,呼叫intercept來進行下一步

該類的主要成員有

realinterceptorchain 對proceed進行了擴充套件,在***鏈式傳遞的過程中增加了這些物件的傳遞。所以執行***的時候,啟動下乙個***的前,可以對這些物件進行建立或者修改,然後再傳遞給下乙個***,或者呼叫這些物件完成相應的功能。比如在 retryandfollowupinterceptor 會建立 streamallocation,在 bridgeinterceptor 會修改 request 的請求頭,在 connectinterceptor 會呼叫 streamallocation 的newstream方法建立連線等等。

call 抽象了一次請求,唯一實現類為 realcall

當我們呼叫call.execute發起請求後,整個請求的流程發生在下面的方法中

private response getresponsewithinterceptorchain() throws ioexception 

interceptors.add(new callserverinterceptor(

retryandfollowupinterceptor.isforwebsocket()));

interceptor.chain chain = new realinterceptorchain(

interceptors, null, null, null, 0, originalrequest);

return chain.proceed(originalrequest);

}

通過一系列***進行鏈式操作,一環接一環,每個***負責單獨的任務,環環相扣完成整個請求

責任鏈模式 遇上對的人

在公司中費用的審批是一件很嚴格的事情,每個審批人可審批的最大額度都是不一致的,超過最大額度,只能交給上級審批。而每次進行費用審批,如果都能知道相應的審批人,則可以大大的節省審批時間。所以在對的時間遇上對的人就尤為重要,而責任鏈模式則可以使之變得可能。introduce 抽象審批人 public ab...

責任鏈模式

責任鏈模式 chain of responsibility 的目標是使多個物件都有機會處理請求,從而避免請求的傳送者和接收者之間的耦合關係。將這些物件連成一條鏈,並沿著這條鏈傳遞請求,直到有乙個物件處理它為止。舉個例子。你到銀行去辦理業務,只是簡單的存個錢,也許atm就解決你的問題。如果你是為了交費...

責任鏈模式

有3個request與3個handler,每個request由相應的handler來處理,當乙個handler與request不匹配時則傳遞給下乙個handler來處理 inte ce request class request1 implements request class request2 ...