面向?qū)ο蟮牧笤瓌t之 —— 接口隔離原則
學(xué)習了何紅輝、關(guān)愛民寫的《Android設(shè)計模式》,對于面向?qū)ο蟮牧笤瓌t有進一步的理解,特此根據(jù)自己的理解記錄總結(jié)一下
什么是接口隔離原則
接口隔離的目的就是將龐大的接口拆分成更小的或者說更具體的接口,使得系統(tǒng)的耦合度大大降低,從而容易重構(gòu)、修改等
在《面向?qū)ο蟮牧笤瓌t之
—— 單一原則》中我們有如下代碼:
[java]?view
plain?copy
/**?
????*?緩存到sd卡?
????*?@param?url?圖片的url?
????*?@param?bitmap?bitmap對象?
????*/??
???public?void?put(String?url?,Bitmap?bitmap){??
???????FileOutputStream?output?=?null;??
???????try?{??
???????????output?=?new?FileOutputStream(cacheDir+url);??
???????????bitmap.compress(Bitmap.CompressFormat.PNG,100,output);??
???????}?catch?(FileNotFoundException?e)?{??
???????????e.printStackTrace();??
???????}finally?{??
???????????//無論是否有異常,都要關(guān)閉流??
???????????try?{??
???????????????if(output!=null){??
???????????????????output.close();??
???????????????}??
???????????}?catch?(IOException?e)?{??
???????????????e.printStackTrace();??
???????????}??
???????}??
??
???}??
這段代碼的可讀性我就不說了,各種try...catch,沒辦法,因為在操作完流之后,要關(guān)閉流,可是有沒有發(fā)現(xiàn),如果你在類中加入的可關(guān)閉對象過多的時候,你的關(guān)閉代碼就寫的到處都是,這明顯讓人很不爽,看看jdk1.6的API,所有流都實現(xiàn)了Closeable接口,代表著可關(guān)閉,既然是這樣,我們就把Closeable封裝一下:
[java]?view
plain?copy
import?java.io.Closeable;??
import?java.io.IOException;??
??
/**?
?*?Created?by?Administrator?on?2016/3/1.?
?*/??
public?class?CloseableUtil?{??
????public?static?void?close(Closeable?closeable){??
????????try?{??
????????????if(closeable!=null){??
????????????????closeable.close();??
????????????}??
????????}?catch?(IOException?e)?{??
????????????e.printStackTrace();??
????????}??
????}??
}??
修改代碼:
[java]?view
plain?copy
/**?
?????*?緩存到sd卡?
?????*?@param?url?圖片的url?
?????*?@param?bitmap?bitmap對象?
?????*/??
????public?void?put(String?url?,Bitmap?bitmap){??
????????FileOutputStream?output?=?null;??
????????try?{??
????????????output?=?new?FileOutputStream(cacheDir+url);??
????????????bitmap.compress(Bitmap.CompressFormat.PNG,100,output);??
????????}?catch?(FileNotFoundException?e)?{??
????????????e.printStackTrace();??
????????}finally?{??
????????????CloseableUtil.close(output);??
????????}??
????}??
發(fā)現(xiàn)嵌套的try去掉了,瞬間覺得舒服很多
為什么我們能這樣做,因為在JDK1.6中,所有的流都實現(xiàn)依賴了Closeable接口,具體的實現(xiàn)都在實現(xiàn)了Closeable接口的子類中,所以,這也是依賴倒置原則,子類只需要做細節(jié)的事,其他都不關(guān)心,這其實就是接口隔離原則,在ImageLoader中的ImageCahce就是接口隔離的運用,我們將ImageCache抽象出來,ImageLoader只需要知道該圖片是不是有緩存,沒緩存我就去網(wǎng)上下載,不管緩存的具體實現(xiàn),也就是具體的實現(xiàn)對ImageLoader是隱藏的,它看不到,這就是我們將ImageLoader這個類的作用拆分的更加細致化的結(jié)果,ImageLoader跟其他三個實現(xiàn)類都沒有直接關(guān)系,也就降低了耦合度,自然靈活度就上升了。
單一原則、開閉原則、里氏替換原則、依賴倒置原則、接口隔離原則,其實是相輔相成的,他們同一時刻出現(xiàn)的時候,使得一個軟件系統(tǒng)更新清晰、最大程度擁抱變化。