Android 依賴注入

最近手頭沒什么項目,正好可以靜下心來提升一下自己的水平(:з」∠)。于是就瞄上了Dependency Injection(依賴注入)這玩意。OK ,以下進入正題。
先來分析一下什么是依賴。舉個栗子,某地區(qū)執(zhí)法人員(咳咳,俗稱Cops)接到一起案子,并且需要盡快破案。那破案需要什么?當然是證據咯!證據又需要誰來分析呢?鑒證師咯(不是鑒黃師??!謝謝!)那么,我們可以粗糙地設定下面的幾個類(非專業(yè)人士,隨便設了):

        private Authenticators authenticators;    
        public Police() {        
            authenticators = new Authenticators();    
        }    
        public void solvingThisCase()    {
            Evidence evidence = getTheEvidence(); // 現(xiàn)場取證
            authenticators.analysisEvidence(evidence); // 分析證據
            authenticators.reportTheResult();   // 得到分析報告                                          
            ...  // 抓人什么的    
        }        
}```
從上述類中可以看到,Cops要破案就必須依賴Authenticators的協(xié)助,Cops依賴了authenticators的鑒證方法,在程序中也一樣,一個功能類要實現(xiàn)某種功能必須依賴相關的類的協(xié)助才能實現(xiàn),這就是依賴!(不知道我這么說懂伐...)。故事接著講(好難編!(╯°Д°)╯︵ ┻━┻)
Cops在抓到人以后,發(fā)現(xiàn),哎呦!TM抓錯人了(程序報錯!或功能錯了)!開啟推卸責任模式!好吧,案子從頭到尾都是Cops類在經手的,那么要查當然也要先查Cops類中是否出了什么問題,那么問題又來了,Cops類中還有Authenticators類的作用,那么到底是Cops的辦案手法(methods)錯了還是Authenticators里面的鑒證手段(methods)出了問題呢?從這里就可以看出,依賴是有很大缺點的,要是案子很復雜(程序很大),開發(fā)者需要下多大的精力去找到癥結所在!開啟上帝模式的開發(fā)者要一步步先觀察Cops的手段有沒有問題再去分析鑒證師的鑒證手法有沒有問題,累趴!
改善辦案手法的時候到了,依賴反轉(Dependency Inversion)!看下面的代碼:
```  public class Cops {
        private Authenticators authenticators;    
        public Police(Authenticators authenticators) {        
            this.authenticators = authenticators;    
        }    
        public void solvingThisCase()    {
            Evidence evidence = getTheEvidence(); // 現(xiàn)場取證
            authenticators.analysisEvidence(evidence); // 分析證據
            authenticators.reportTheResult();   // 得到分析報告                                          
            ...  // 抓人什么的    
        }        
}```
       注意!這里的authenticators作為參數(shù)通過構造函數(shù)給傳進去了!相當于我們的鑒證師在Cops著手辦案的時候就把所有的Evidence都已經準備好了,Cops要用的時候直接去調用就可以了,在前面講依賴的時候,我們需要去新建Authenticators的具體對象來作為依賴,而這里直接作為抽象參數(shù)調用了方法,實現(xiàn)了責任分離。一個很明顯的現(xiàn)象是,在Android Logcat里面報出Error的時候定位會直接在初始化以及傳入Authenticators參數(shù)的地方而不是在Cops類下面,跳過了解決Bug的一大步!雖然這么一步對解決問題不是很明顯,但是一旦程序龐大臃腫以后將產生巨大的推進作用。這就是依賴反轉,化具體為抽象。
       然后,問題又來了!這樣做固然可以對象分離,但是總不可能把所有的依賴類都作為構造參數(shù)傳入構造函數(shù)里去吧?!Cops類里面再來個法醫(yī)類、城管類什么的放到構造函數(shù)里面,Cops還能不能愉快地玩耍了!另外,依賴類不在被依賴類里面初始化總得找個地方變身不是!針對這兩種現(xiàn)象,這里就要引入我們的主角--依賴注入了!!
為了表示它的重要,另起一段!“依賴注入”依在下淺見,相當于在各種功能類之間設立一個依賴注入器!大白話就是,設立一個統(tǒng)籌器,專門負責提供其它類的實例并注入依賴。功能類的創(chuàng)建集中于App的一個統(tǒng)一入口,我們對這個注入器有完全的控制權。
      這里再安利一個開源庫[Dagger](http://square.github.io/dagger/)不知道不能翻墻能不能打開。介紹一下這個庫的好處:
>Dagger是專為低端設備設計的依賴注入器。大部分依賴注入器通過反射來創(chuàng)建和注入依賴。反射機制是很棒的,但在低端設備上面耗時嚴重,特別是在老的android版本上面。然而,Dagger使用預編譯器創(chuàng)建工作所需的所有類。這樣一來,就不需要用到反射了。Dagger相比其他依賴注入器功能稍弱,但卻是效率最高的。

以上!

參考:
1.http://antonioleiva.com/dependency-injection-android-dagger-part-1/
2.http://square.github.io/dagger/


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容