【原】回调机制

一直对回调机制不明白?回调?什么鬼?干吗使的?有毛用?异步

其实顾名思义,回调就是“回过头来调用对方”。即:当我联系你时,你又回过头来联系我。对,没错,就是好莱坞法则——“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类之间的关系,因此看下来仍是云里雾里的,至于回调有什么用?能够结合异步来看,请看这篇博文还有这篇还有这篇这篇我还没看,应该也不错。

本文纯粹是今晚忽然搞懂,想趁热打铁记录一下,确定存在理解误差,逻辑硬伤等问题。之后抽空完善一下。

若是各位看完还不懂,抱歉浪费你们的时间了,能够留言讨论。

相关文章
相关标签/搜索