作者:Dion
鏈接:https://www.zhihu.com/question/20111251/answer/14012223
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
“接口是個規范”,這句沒錯。
“不如直接就在這個類中寫實現方法豈不是更便捷”,你怎么保證這個接口就一個類去實現呢?如果多個類去實現同一個接口,程序怎么知道他們是有關聯的呢?
既然不是一個類去實現,那就是有很多地方有用到,大家需要統一標准。甚至有的編程語言(Object-C)已經不把接口叫 interface,直接叫 protocol。
統一標准的目的,是大家都知道這個是做什么的,但是具體不用知道具體怎么做。
比如說:
我知道 Comparable 這個接口是用來比較兩個對象的,那么如何去比較呢?
數字有數字的比較方法,字符串有字符串的比較方法,學生(自己定義的類)也有自己的比較方法。
然后,在另外一個負責對象排序(不一定是數字喔)的代碼里面,肯定需要將兩個對象比較。
這兩個對象是什么類型呢?
Object a,b?肯定不行,a > b 這樣的語法無法通過編譯。
int a,b?也不行?一開始就說了,不一定是數字。
....
所以,Comparable 就來了。他告訴編譯器,a b 兩個對象都滿足 Comparable 接口,也就是他們是可以進行比較的。具體怎么比較,這段程序不需要知道。
所以,他需要一些具體的實現,Comparable 接口有一個方法,叫 compareTo。那么這個方法就是用來取代 <、> 這樣的運算符。
因為運算符是編譯器保留給內置類型(整數、浮點數)進行比較用的,而不是一個廣義的比較運算。
如果你可以明白 JDK 自身庫里面諸如 Comparable 這樣已經有的接口,那么就很容易理解自己在開發程序的時候為什么需要用到接口了。
這樣寫的第一個作用:
“不如直接就在這個類中寫實現方法豈不是更便捷”,你怎么保證這個接口就一個類去實現呢?如果多個類去實現同一個接口,程序怎么知道他們是有關聯的呢?
可能有些同學還不知道我們探討的具體是什么問題。這里給出例子
public abstract class Context {
public final class ContextImpl extends Context {
就如上面的文字部分所說,你怎么就保證了只有一個類會去實現這個接口呢?事實上,Context類的結構是這樣的:
但是,有的時候,我參看源碼,又會發現,很多時候,一個接口只有一個實現類,他還是要這么做,這樣是不是真的就多此一舉了呢?
很抱歉,依然不是多此一舉。在這里的作用是——項目協作,是項目模塊化的利器。當你決定把一個類,僅僅給自己用,而且不打算再度擴展,那么這個時候,你可以選擇不用接口+接口impl的形式。但是一旦你是進行一個團隊合作的話,你就必須這么做。這個時候,接口就成為了一個約定,你的團隊成員就無需在意你的代碼細節,只需要關注於你的功能即可。說到這里,你是否可以想到,后台給你的東西,也叫接口?你再好好想想何為接口?難道后台返回給你所有的代碼才是最合適的嗎?我來替你總結一下,接口的作用之一:別人替你做了一些事,只給你你個調用口,你就可以成功地使用這個調用口,去得到他在背后默默地替你做的所有的操作所返回的結果。這,就是接口。
再說項目模塊化。啥是項目模塊化?我的師傅這樣問我。我裝B的回答:
“不太懂 我目前的認知是 組件化像sdk一樣
只和調用者耦合“
師傅又問,帶着怒意:
“ 模塊化 懂 嗎?”
我:“不懂”
師傅:“
組件化 先別 去理解 了 那個東西 沒有固定的 概念
都是按個人理解
模塊 化 就好開解了
好理解了
用戶中心 模塊
商城 模塊
o2
o2o模塊
聊天模塊
網絡請求可以 是模塊 也可以叫組件
類似這樣
每個模塊 做每個模塊固定的功能
理解了?
”
這回我懂了,什么聊天模塊,商城模塊就是模塊。
這個時候你可能感覺到接口的必要性了吧! 那么我的商城模塊這么多類,又互不統一,怎么才能優雅的以接口的形式暴露出來呢?
你可以弄一個托管類接口,再弄一個托管類impl,在托管類impl中進行一個調用即可。
總結一下:
1.用接口形成多實現體系,如集合框架
2.項目協作, 最小代價、最優雅地暴露功能給隊友
3.模塊化
最后 看了一點effective java 又領悟到了模塊之間解耦的作用
這個不是我隨便亂說的 我能講通道理
interface和interfaceImpl還有調用者。本來是調用者和類直接耦合了,現在是interface和interfaceImpl建立聯系,interface和調用者建立聯系,我們旨在減少調用者和類的直接聯系,這叫封裝,也叫信息隱藏。

