接口回調是個比較抽象可是很重要的知識,大多數初學者都會在剛接觸它時感受抓不住要領,但當咱們實際掌握它後,會對它愛不釋手。廢話很少說,讓咱們開始吧。
我認識新事物的通常有這樣的習慣,就是先從事物的名稱入手。那麼對於接口回調這個新事物,咱們能從這個名字中獲取多少信息呢?首先是接口,什麼是接口呢?相信有必定編程基礎的朋友都知道,就是一種規範,可是這種規範在沒有實現以前,沒有任何做用。就比如招聘廣告同樣,廣告上列出的條件都是寬泛的,如我要招一名熟悉Java的程序員。這是一個規範,你想來應聘就必須知足熟悉Java這個條件,但知足這個條件的人狀況可能千差萬別,多是男的,也能夠有女的,多是高手,也可能恰好知足這個條件。可是隻要知足這個條件了,均可以來應聘,均可以稱爲一名應聘者。這裏,招聘條件就是接口,應聘者就是實現。那麼回調又怎樣理解呢?回調——回來調用,回哪呢,回到定義的地方,回到實現的地方,那麼這是否是間接的陳述了一個事實,就是我實現接口的地方和我調用接口的地方不是同一個地方。由此問題是否是就明瞭了。接口回調就是我有一個功能,可是這個功能我沒有,可是有一個實體它有這個功能,我就能夠經過它的功能來實現個人功能。
是否是還很暈呢?是的,那咱們接着往下。舉一個例子,在文檔編輯器中通常會有打印這個功能,我調用打印這個功能的時候,假如不給它提供一臺可正常工做的打印機時,它是沒有辦法工做的。可是當咱們接上打印機後,再執行打印這個功能,打印內容出如今了打印機的出口,打印功能完成。但是若是我沒有在文檔編輯器中調用這個打印功能呢,是否是就不會有打印結果產生了,這是否是很神奇。這就是接口回調的魅力,功能我有可是真正作事的不是我,可是你想作事又不能沒有我。
那麼這樣作有什麼意義呢?再舉個例子,如我須要粉刷房子,可是我本身又不會粉刷,那麼怎麼辦呢?確定得找人來粉刷啊,而不是由粉刷工人來問我是否是須要粉刷房子。由於粉刷的時間是不肯定的,不可能每時每刻都有粉刷需求。在咱們根據各類狀況判斷後,在合適的時間,咱們再請粉刷工人來完成咱們的粉刷任務。在咱們不須要粉刷的時候,粉刷工人能夠爲其餘人服務,這樣提升了粉刷工人的工做效率,又不至於影響個人粉刷任務。因此接口回調的意義就很明確了,由我來指揮我要作什麼事,可是我不作事,咱們由執行者的身份轉換爲了指揮者,這樣便於組織咱們的功能,又不會浪費一大把的寶貴資源。
說了老半天,那麼咱們應該怎樣來實現接口回調呢?以上面的粉刷房子爲例,我寫了一個小的測試程序。程序員
1 package andy.example; 2 3 public interface Paint { 4 //粉刷任務 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.println("我是一名粉刷匠,粉刷本領強!"); 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 worker 17 * 粉刷工人 18 */ 19 public void doPaint(Paint paint) { 20 if (isNeedPaint) { 21 paint.paint(); 22 } else { 23 System.out.println("房子不須要粉刷,你特麼逗我呢!"); 24 } 25 } 26 }
可能須要粉刷的人。ide
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("不須要粉刷房子的請求者,調用粉刷方法後"); 18 asker1.doPaint(worker); 19 System.out.println("須要粉刷房子的請求者,調用粉刷方法後"); 20 asker2.doPaint(worker); 21 } 22 23 }
測試類。測試
毫無疑問的結果。this
簡單分析:須要粉刷的人根據狀況判斷房子是否須要粉刷,在不須要粉刷的時候調用粉刷功能是無效的,如結果一,真正須要粉刷的人,在合適的時候調用粉刷方法,完成粉刷工做。spa