面向?qū)ο蟮牧笤瓌t之 —— 依賴倒置原則
學(xué)習(xí)了何紅輝、關(guān)愛(ài)民寫(xiě)的《Android設(shè)計(jì)模式》,對(duì)于面向?qū)ο蟮牧笤瓌t有進(jìn)一步的理解,特此根據(jù)自己的理解記錄總結(jié)一下
什么是依賴倒置原則
其實(shí)依賴倒置原則就是告訴你,不要讓你的程序耦合度過(guò)高
在依賴倒置原則中有幾個(gè)關(guān)鍵點(diǎn):
第一:高層模塊不應(yīng)該直接依賴低層模塊,兩者應(yīng)該依賴其抽象
第二:抽象不應(yīng)該依賴細(xì)節(jié)
第三:細(xì)節(jié)應(yīng)該依賴抽象
我們知道在java中,抽象就是指接口或者抽象類(lèi),兩個(gè)都是不能直接實(shí)例化的,要通過(guò)其具體實(shí)現(xiàn)類(lèi),即子類(lèi)來(lái)實(shí)例化具體操作,而子類(lèi)就是上面所說(shuō)的細(xì)節(jié),子類(lèi)繼承自父類(lèi),即細(xì)節(jié)應(yīng)該依賴抽象,而父類(lèi)不管子類(lèi)做了什么操作,只是定義了一個(gè)標(biāo)準(zhǔn),即抽象不應(yīng)該依賴細(xì)節(jié),當(dāng)兩者滿足后,其實(shí)也就滿足了高層模塊不應(yīng)該直接依賴低層模塊,兩者應(yīng)該依賴其抽象。
依舊是已我們《面向?qū)ο蟮牧笤瓌t之 —— 單一原則》的圖片加載器為例
如果我們只實(shí)現(xiàn)了單一原則,那么只要出現(xiàn)要添加新的緩存方式的話,我們的ImageLoader類(lèi)就要進(jìn)行修改,這明顯就不符合了依賴倒置中的高層模塊不應(yīng)該直接依賴低層模塊,說(shuō)白了就是,我要添加新的緩存方式,但是我不能動(dò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卡緩存的時(shí)候,我的ImageLoader類(lèi)就要修改成:
[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)這樣的寫(xiě)法,我們每一次加入新的緩存方式,都要?jiǎng)覫mageLoader類(lèi)里面的東西。
所以這樣的寫(xiě)法幾乎沒(méi)有靈活性,而依賴倒置原則其實(shí)就是要求我們讓依賴抽象,而不依賴具體實(shí)現(xiàn)
所以在《面向?qū)ο蟮牧笤瓌t之 —— 開(kāi)閉原則》中,加入了ImageCache接口類(lèi),但凡要實(shí)現(xiàn)緩存都要實(shí)現(xiàn)此類(lèi),借此,我們自然就達(dá)到了高層模塊不應(yīng)該直接依賴低層模塊,即ImageLoader跟MemoryCache、DiskCache、DoubleCache沒(méi)有直接關(guān)系,而是通過(guò)ImageCache達(dá)到了細(xì)節(jié)依賴了抽象,而抽象不管細(xì)節(jié)的效果。