一直對回調機制不明白?回調?什麼鬼?幹嗎使的?有毛用?異步
其實顧名思義,回調就是「回過頭來調用對方」。即:當我聯繫你時,你又回過頭來聯繫我。對,沒錯,就是好萊塢法則——「Don't call me; I'll call you.」函數
不過這裏須要改一點細節,「don't bother me, if you are really good ,I'll call you ,but firstly,you should tell me your number」 this
這樣解釋是否是有點小明白了?不明白?不要緊,繼續往下來url
網上關於回調機制的博文太多了,你們確定知道,回調是【「A類中調用B類中的某個方法C,而後B類中反過來調用A類中的方法D」】blahblahspa
若是把A當作是演員的話,B當作好萊塢,那麼首先演員A給好萊塢B打了一個電話,而後好萊塢B又反過來聯繫演員A。.net
but!第一次調用A CALL B,實際上是爲了讓B call A啊。仍是不明白?code
情景融入型:對象
-----------------------------------------如下是背景----------------------------------------------blog
好萊塢很牛,演員都很想進,but,hollywood的管理很是規範,有本身的一套標準【瞅清楚了,這個標準是B制定的,對B是可知的】,全部想進來的演員必須服從這套標準(接口)【A類必須服從這套標準】接口
interface ActorStandard{
void 培養();
.....
}
---------------------------------如下是第一次調用---------------------------------------
A:「喂?是好萊塢嗎?我是演員A,我如今給你打電話,這個就是個人手機號,我很牛哦,並且符合大家的標準哦」(實現接口ActorStandard)
B:「好的,我記下你的電話了,我一下子看看你的做品,真的牛逼的話,我就聯繫你的」
---------------------------------如下是第二次調用----------------------------------------
B:「是A嗎?你的確很牛,咱們接受你了。接下來,咱們會包裝你(調用A中的接口方法實現),推廣你(調用A中的接口方法實現)。。。」
--------------------------------回調完畢-----------------------------------------
明白了嗎?第一次A調用B其實偏偏是爲了讓B調用A(中的方法),
那麼問題來了:
第一次調用的意義在哪兒?
答:由於B只定義了規範,並不知道A的存在!第一次調用使得B知道了A的存在,所以此次調用主要是註冊登記A的信息。因此第一次調用的函數也能夠稱做註冊函數。
若是不採用回調,用直接調用能夠嗎?
答:這種狀況是不能夠的,首先咱們看一下這三個類/接口的關係。
B制定的標準ActorStandard,所以目前爲止,ActorStandard對B是可見的,可是演員A對B是不可見的。
因而,B類如想與ActorStandard有交互,則其中必需要包含一個ActorStandard,可是因爲ActorStandard只是接口,所以,其實現類只能從外面傳進來。
演員A要符合ActorStandard標準,所以ActorStandard對A是可見的。並且演員A要先去B那裏註冊,因此B對A也是可見的。
因而,A類要實現ActorStandard的接口,其次A類中要有B類的對象,以便在B那裏註冊登記本身的信息。
爲啥A必定要去B那裏註冊?
答:上面說了,B只認識ActorStandard這個接口,若是A這個實現類對B一直保持透明,那二者之間如何作交互?
所以,結構應該是這樣的。
1 package test; 2 3 interface ActorStandard{ 4 void bringUp(); 5 String getName(); 6 } 7 8 class Actor implements ActorStandard{ 9 private Hollywood hollywood; 10 private String name; 11 //這個方法雖然在Actor類中,可是每每是提供給Hollywood調用的,本身不調用 12 //爲何? 13 //由於Actor只是實現了標準啊,這個標準的制定者是Hollywood。動做的執行者也是Hollywood。 14 //本身的方法,讓別人調用,並且是本身的調用者反過來調用本身的方法,所以叫回調【不知道能不能理解】 15 public void bringUp(){ 16 System.out.println("準備培養...."); 17 System.out.println("先包裝一下..."); 18 System.out.println("再炒做一番..."); 19 } 20 public String getName() { 21 return name; 22 } 23 public Actor(Hollywood hollywood, String name) { 24 this.hollywood = hollywood; 25 this.name = name; 26 } 27 public void call(){//第一次調用,完成註冊 28 System.out.println("I am " + name + ", I am gona call hollywood"); 29 hollywood.register(this); 30 } 31 } 32 33 class Hollywood { 34 public void register(ActorStandard actor){//註冊完成 35 System.out.println("this is hollywood,I received a phone"); 36 System.out.println("oh, now I know this call is from " + actor.getName()); 37 System.out.println("he is purly good,I am gonna to bring up with him"); 38 actor.bringUp();//第二次調用,反向調用。所謂callback 39 } 40 } 41 42 public class CallBackTest { 43 public static void main(String[] args) { 44 Hollywood hollywood = new Hollywood(); 45 Actor hughJackman = new Actor(hollywood, "Hugh Jackman"); 46 hughJackman.call(); 47 } 48 }
運行結果以下:
I am Hugh Jackman, I am gona call hollywood
this is hollywood,I received a phone
oh, now I know this call is from Hugh Jackman
he is purly good,I am gonna to bring up with him
準備培養....
先包裝一下...
再炒做一番...
若是還不明白,那我是真的沒辦法了。我在網上找了不少文章,可是基本上都沒有解釋接口和B類之間的關係,因此看下來仍是雲裏霧裏的,至於回調有什麼用?能夠結合異步來看,請看這篇博文,還有這篇,還有這篇。這篇我還沒看,應該也不錯。
本文純粹是今晚忽然搞懂,想趁熱打鐵記錄一下,確定存在理解誤差,邏輯硬傷等問題。之後抽空完善一下。
若是各位看完還不懂,抱歉浪費你們的時間了,能夠留言討論。