笑談接口回調

  接口回調是個比較抽象可是很重要的知識,大多數初學者都會在剛接觸它時感受抓不住要領,但當咱們實際掌握它後,會對它愛不釋手。廢話很少說,讓咱們開始吧。
  我認識新事物的通常有這樣的習慣,就是先從事物的名稱入手。那麼對於接口回調這個新事物,咱們能從這個名字中獲取多少信息呢?首先是接口,什麼是接口呢?相信有必定編程基礎的朋友都知道,就是一種規範,可是這種規範在沒有實現以前,沒有任何做用。就比如招聘廣告同樣,廣告上列出的條件都是寬泛的,如我要招一名熟悉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

相關文章
相關標籤/搜索