接口回調(diào)是個比較抽象但是很重要的知識,大多數(shù)初學(xué)者都會在剛接觸它時感覺抓不住要領(lǐng),但當(dāng)我們實際掌握它后,會對它愛不釋手。廢話不多說,讓我們開始吧。
我認(rèn)識新事物的一般有這樣的習(xí)慣,就是先從事物的名稱入手。那么對于接口回調(diào)這個新事物,我們能從這個名字中獲取多少信息呢?首先是接口,什么是接口呢?相信有一定編程基礎(chǔ)的朋友都知道,就是一種規(guī)范,但是這種規(guī)范在沒有實現(xiàn)之前,沒有任何作用。就好比招聘廣告一樣,廣告上列出的條件都是寬泛的,如我要招一名熟悉java的程序員。這是一個規(guī)范,你想來應(yīng)聘就必須滿足熟悉Java這個條件,但滿足這個條件的人情況可能千差萬別,可能是男的,也可以有女的,可能是高手,也可能剛好滿足這個條件。但是只要滿足這個條件了,都可以來應(yīng)聘,都可以稱為一名應(yīng)聘者。這里,招聘條件就是接口,應(yīng)聘者就是實現(xiàn)。那么回調(diào)又怎樣理解呢?回調(diào)——回來調(diào)用,回哪呢,回到定義的地方,回到實現(xiàn)的地方,那么這是不是間接的陳述了一個事實,就是我實現(xiàn)接口的地方和我調(diào)用接口的地方不是同一個地方。由此問題是不是就明了了。接口回調(diào)就是我有一個功能,但是這個功能我沒有,但是有一個實體它有這個功能,我就可以通過它的功能來實現(xiàn)我的功能。
是不是還很暈?zāi)兀渴堑?,那我們接著往下。舉一個例子,在文檔編輯器中一般會有打印這個功能,我調(diào)用打印這個功能的時候,假如不給它提供一臺可正常工作的打印機時,它是沒有辦法工作的。但是當(dāng)我們接上打印機后,再執(zhí)行打印這個功能,打印內(nèi)容出現(xiàn)在了打印機的出口,打印功能完成??墒侨绻覜]有在文檔編輯器中調(diào)用這個打印功能呢,是不是就不會有打印結(jié)果產(chǎn)生了,這是不是很神奇。這就是接口回調(diào)的魅力,功能我有但是真正做事的不是我,但是你想做事又不能沒有我。
那么這樣做有什么意義呢?再舉個例子,如我需要粉刷房子,但是我自己又不會粉刷,那么怎么辦呢?肯定得找人來粉刷啊,而不是由粉刷工人來問我是不是需要粉刷房子。因為粉刷的時間是不確定的,不可能每時每刻都有粉刷需求。在我們根據(jù)各種情況判斷后,在合適的時間,我們再請粉刷工人來完成我們的粉刷任務(wù)。在我們不需要粉刷的時候,粉刷工人可以為其他人服務(wù),這樣提高了粉刷工人的工作效率,又不至于影響我的粉刷任務(wù)。所以接口回調(diào)的意義就很明確了,由我來指揮我要做什么事,但是我不做事,我們由執(zhí)行者的身份轉(zhuǎn)換為了指揮者,這樣便于組織我們的功能,又不會浪費一大把的寶貴資源。
說了老半天,那么我們應(yīng)該怎樣來實現(xiàn)接口回調(diào)呢?以上面的粉刷房子為例,我寫了一個小的測試程序。
1 package andy.example;2 3 public interface Paint {4 //粉刷任務(wù)5 void paint();6 }
在這里,我們定義了一個接口,該接口里只有一個粉刷的方法。
1 package andy.example; 2 3 //工人實體,具有粉刷功能 4 public class Worker implements Paint{ 5 6 @Override 7 public void paint() { 8 System.out.); 9 }10 11 }
真正具有粉刷功能的粉刷工人。
1 package andy.example; 2 3 //可能需要粉刷房子的實體 4 public class Asker { 5 6 // 是否需要粉刷 7 private boolean isNeedPaint; 8 9 public void setIsNeedPaint(boolean isNeedPaint) {10 this.isNeedPaint = isNeedPaint;11 }12 13 /**14 * 指揮粉刷15 * 16 * @param worker17 * 粉刷工人18 */19 public void doPaint(Paint paint) {20 if (isNeedPaint) {21 paint.paint();22 } else {23 System.out.println("房子不需要粉刷,你特么逗我呢!");24 }25 }26 }
可能需要粉刷的人。
1 package andy.example; 2 3 //測試類 4 public class Test { 5 6 public static void main(String[] args) { 7 //有兩個請求者 8 Asker asker1=new Asker(); 9 Asker asker2=new Asker();10 11 //第二個真正需要粉刷12 asker2.setIsNeedPaint(true);13 14 //同一個粉刷工人15 Worker worker=new Worker();16 17 System.out.println("不需要粉刷房子的請求者,調(diào)用粉刷方法后");18 asker1.doPaint(worker);19 System.out.println("需要粉刷房子的請求者,調(diào)用粉刷方法后");20 asker2.doPaint(worker);21 }22 23 }
測試類。

毫無疑問的結(jié)果。
簡單分析:需要粉刷的人根據(jù)情況判斷房子是否需要粉刷,在不需要粉刷的時候調(diào)用粉刷功能是無效的,如結(jié)果一,真正需要粉刷的人,在合適的時候調(diào)用粉刷方法,完成粉刷工作。
新聞熱點
疑難解答