由於Retrofit作到了很強的解耦,所以就必定須要用到不少設計模式。因此,我以爲,經過閱讀Retrofit源碼來學習設計模式是再好不過的設計模式學習方法了。設計模式
大體看了一圈Retrofit源碼,受益不淺。 從網上盜用兩張圖,以下: 對於網絡請求庫的封裝,主要包括3部分:網絡
一、數據的組裝框架
二、發送網絡請求學習
三、處理返回數據,並回調結果優化
對於步驟一,數據的組裝:ui
Retrofit採用了外觀模式(門面模式)、動態代理模式和建造者模式。Retrofit利用了接口的的方式,將請求數據規範成一個接口,而後經過對用戶定義的接口進行解析,而後將解析的數據組裝成請求的數據。設計
Retrofit類做爲外部使用的惟一入口,這是一種外面模式,也叫門面模式。用戶使用時,只須要使用Retrofit的create方法就能夠。3d
那麼用戶定義的接口是如何轉換成請求數據的呢?Retrofit很是精彩地使用了動態代理,去解析用戶定義接口方法中的註解和返回值。代理
對解析的數據進行組裝使用的是建造者模式。該建造者模式的實現類是ServiceMethod的Builder類。blog
對於步驟二,發送網絡請求:
Retrofit使用了適配器模式、工廠方法模式、策略模式。
Retrofit默認使用了OkHttpCall進行網絡請求,這塊是寫死的代碼,之後可能會優化,也多是square公司如今在綁定推廣retrofit和okhttp吧,可是從Retrofit的設計上看,將網絡請求庫改爲可靈活配置,也是比較容易的。
由於Retrofit在網絡庫的配置上採用了適配器模式。其中,CallAdapter就是用於調用OkHttpCall進行網絡請求的。
Retrofit定義了CallAdapter接口和CallAdapter.Factory接口,這是一種工廠方法模式,只有在框架的靈活配置上纔會使用工廠方法模式。
對於Retrofit的策略模式,在Java8CallAdapter中使用了,根據不一樣的狀況返回BodyCallAdapter和ResponseCallAdapter。
對於步驟三,處理返回數據,並回調結果
是在OkHttpCall中進行的。採用了工廠方法模式。
Retrofit定義了Converter和Converter.Factory接口,進行數據的處理。這是工廠方法模式。
用Converter對返回結果進行處理,是在ServiceMethod類中的方法中進行的,而這個方法是在OkHttpCall中調用的。
綜上,經過閱讀Retrofit源碼,讓我對設計模式的理解更加深刻。理解了一些在頭腦中以前很模糊的設計模式概念。