【原】回調機制

一直對回調機制不明白?回調?什麼鬼?幹嗎使的?有毛用?異步

其實顧名思義,回調就是「回過頭來調用對方」。即:當我聯繫你時,你又回過頭來聯繫我。對,沒錯,就是好萊塢法則——「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類之間的關係,因此看下來仍是雲裏霧裏的,至於回調有什麼用?能夠結合異步來看,請看這篇博文還有這篇還有這篇這篇我還沒看,應該也不錯。

本文純粹是今晚忽然搞懂,想趁熱打鐵記錄一下,確定存在理解誤差,邏輯硬傷等問題。之後抽空完善一下。

若是各位看完還不懂,抱歉浪費你們的時間了,能夠留言討論。

相關文章
相關標籤/搜索