面向?qū)ο蟮牧笤瓌t之 —— 依賴倒置原則
學(xué)習(xí)了何紅輝、關(guān)愛民寫的《Android設(shè)計模式》,對于面向?qū)ο蟮牧笤瓌t有進(jìn)一步的理解,特此根據(jù)自己的理解記錄總結(jié)一下
什么是依賴倒置原則
其實(shí)依賴倒置原則就是告訴你,不要讓你的程序耦合度過高
在依賴倒置原則中有幾個關(guān)鍵點(diǎn):
第一:高層模塊不應(yīng)該直接依賴低層模塊,兩者應(yīng)該依賴其抽象
第二:抽象不應(yīng)該依賴細(xì)節(jié)
第三:細(xì)節(jié)應(yīng)該依賴抽象
我們知道在java中,抽象就是指接口或者抽象類,兩個都是不能直接實(shí)例化的,要通過其具體實(shí)現(xiàn)類,即子類來實(shí)例化具體操作,而子類就是上面所說的細(xì)節(jié),子類繼承自父類,即細(xì)節(jié)應(yīng)該依賴抽象,而父類不管子類做了什么操作,只是定義了一個標(biāo)準(zhǔn),即抽象不應(yīng)該依賴細(xì)節(jié),當(dāng)兩者滿足后,其實(shí)也就滿足了高層模塊不應(yīng)該直接依賴低層模塊,兩者應(yīng)該依賴其抽象。
依舊是已我們《面向?qū)ο蟮牧笤瓌t之 —— 單一原則》的圖片加載器為例
如果我們只實(shí)現(xiàn)了單一原則,那么只要出現(xiàn)要添加新的緩存方式的話,我們的ImageLoader類就要進(jìn)行修改,這明顯就不符合了依賴倒置中的高層模塊不應(yīng)該直接依賴低層模塊,說白了就是,我要添加新的緩存方式,但是我不能動ImageLoader里面的代碼,顯然在只滿足單一原則的情況下,是不可能不修改的。
就如以下的做法:
[java]?view
plain?copy
public?class?ImageLoader?{??
??
???????public?ImageLoader()?{??
???????}??
??
???????//使用內(nèi)存緩存??
???????MemoryCache??imageCache=new?MemoryCache();??
???????/**?
????????*?顯示圖片?
????????*?@param?url?圖片的url??
????????*?@param?imageView?要顯示的view??
????????*/??
???????public?void?displayImage(final?String?url,?final?ImageView?imageView)?{??
???????????Bitmap?bitmap=imageCache.get(url);??
???????????if(bitmap!=null){??
???????????????imageView.setImageBitmap(bitmap);??
???????????????return;?}??
???????//省略以下代碼??
上面的做法是ImageLoader只使用了內(nèi)存緩存,當(dāng)我加入sd卡緩存的時候,我的ImageLoader類就要修改成:
[java]?view
plain?copy
public?class?ImageLoader?{??
??
????public?ImageLoader()?{??
????}??
??
????//使用sd卡緩存??
????DiskCache?imageCache=new?DiskCache();??
??
????/**?
?????*?顯示圖片?
?????*?@param?url?圖片的url?
?????*?@param?imageView?要顯示的view?
?????*/??
????public?void?displayImage(final?String?url,?final?ImageView?imageView)?{??
????????Bitmap?bitmap=imageCache.get(url);??
??
????????if(bitmap!=null){??
????????????imageView.setImageBitmap(bitmap);??
????????????return;??
????????}??
????????//省略以下代碼??
發(fā)現(xiàn)這樣的寫法,我們每一次加入新的緩存方式,都要動ImageLoader類里面的東西。
所以這樣的寫法幾乎沒有靈活性,而依賴倒置原則其實(shí)就是要求我們讓依賴抽象,而不依賴具體實(shí)現(xiàn)
所以在《面向?qū)ο蟮牧笤瓌t之 —— 開閉原則》中,加入了ImageCache接口類,但凡要實(shí)現(xiàn)緩存都要實(shí)現(xiàn)此類,借此,我們自然就達(dá)到了高層模塊不應(yīng)該直接依賴低層模塊,即ImageLoader跟MemoryCache、DiskCache、DoubleCache沒有直接關(guān)系,而是通過ImageCache達(dá)到了細(xì)節(jié)依賴了抽象,而抽象不管細(xì)節(jié)的效果。