一直对回调机制不明白?回调?什么鬼?干吗使的?有毛用?异步
其实顾名思义,回调就是“回过头来调用对方”。即:当我联系你时,你又回过头来联系我。对,没错,就是好莱坞法则——“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类之间的关系,因此看下来仍是云里雾里的,至于回调有什么用?能够结合异步来看,请看这篇博文,还有这篇,还有这篇。这篇我还没看,应该也不错。
本文纯粹是今晚忽然搞懂,想趁热打铁记录一下,确定存在理解误差,逻辑硬伤等问题。之后抽空完善一下。
若是各位看完还不懂,抱歉浪费你们的时间了,能够留言讨论。