簡單的 Android Clean Architecture 實現
特性
簡單的實現了一下Android-Clean-Architecture,使用到了一些比較優秀的庫
realm 目前最流弊的移動端db
rxjava 一切都是流,你懂得
butterknife 視圖注入框架
glide 圖片加載框架
retrofit 網絡請求框架,可以與rxjava搭配
原理
最近 Android-CleanArchitecture 鬧得是沸沸揚揚,然而筆者也不甘寂寞,一直在研究這個東西,看過,不少的實現。
比如 android10 大神的實現 https://github.com/android10/Android-CleanArchitecture 比如 googlesample 的實現 https://github.com/googlesamples/android-architecture/tree/todo-mvp-clean/ 比如 dmilicic 大神的實現 https://github.com/dmilicic/Android-Clean-Boilerplate
Boilerplate 其實就是 模板的意思了,相信大家也看過不少這個詞了。
然而,架構方面的文章也很多,但是,究其源頭,無非都是出自uncle-bob 叔叔的這篇 https://blog.8thlight.com/uncle-bob/2012/08/13/the-clean-architecture.html。 至于大家為什么大談特談,那一定是有他的道理的。就好比,用了CleanArchitecture,你會得到以下好處。
代碼復用性更高 更易于測試 耦合度更小
下面這幅圖,是googlesample下面的了。
下面這幅圖,是uncle-bob畫的了。
細心的你已經發現了,這兩個圖其實是一個意思。從大的方向上看,都是三層結構。
DataLayer
最底層,完全不知道有 DomainLayer , PresentationLayer 的存在,聽到這里,你還在懷疑這個架構的 可測試性 和 耦合度低 嗎?那么 DataLayer 的主要職責是什么? 1、從網絡獲取數據,向網絡提交數據,總之就是和網絡打交道。 2、從本地DB,shareprefence等等,內存等,總之就是本地獲取數據,緩存數據,總之就是和本地數據打交道的。 這也就是你為什么看到很多Android-CleanArchitecture 的 package里面有一個local ,和一個remote了,然而是否有必要分的這么細,個人習慣啊~,不強求。反正這一層如果出現了 anroid.os***,我就更你拼了,對不起,你已經偏離了Android-CleanArchitecture了。
DomainLayer
中間層,他完全不知道有一個 PresentationLayer 存在,他只知道,有DataLayer,他可以基于這些數據,建立很多玩法,比如去網絡拿一堆名人回來,然后將這些數據緩存到本地,在比如,他寫了一篇黑某明星的文章,將文字發布到網上等等。因此他的主要職責是: 1、控制 DataLayer 對數據做 增刪改查 ,沒錯,就這么簡單,然后就沒有然后了。 2、真的沒有了,不騙你,但是這一層如果出現了 anroid.os***,我就更你拼了,對不起,你已經偏離了Android-CleanArchitecture了。
PresentationLayer
最上層,他知道 DomainLayer ,有人要問了,那么他知道 DataLayer ,回答,他知道你妹~ 他累不累啊,要知道這么多? 因此,它只知道 DomainLayer ,那么他的職責有哪些? 1、通知 DomainLayer 有活干了,根據 DomainLayer 反饋變化界面 2、通知 DomainLayer 有活干了,根據 DomainLayer 反饋變化界面 3、通知 DomainLayer 有活干了,根據 DomainLayer 反饋變化界面 這年頭,重要的時間一定要說三遍,而且,就是這么任性~~
分析了每層之后,我們發現,依賴的關系是 PresentationLayer --> DomainLayer --> DataLayer 的。 DomainLayer --> DataLayer 不知道有android平臺的存在。 因此,只要我們圍繞這個原則去做架構,那么就稱的上是Android-CleanArchitecture。
todo
dagger2依賴注入,隨便比較難理解吧,但是用上之后,顯然要大幅降低耦合。