【原】回调机制

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

其实顾名思义,回调就是“回过头来调用对方”。即:当我联系你时,你又回过头来联系我。对,没错,就是好莱坞法则——“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

这样解释是不是有点小明白了?不明白?没关系,继续往下来

网上关于回调机制的博文太多了,大家肯定知道,回调是【“A类中调用B类中的某个方法C,然后B类中反过来调用A类中的方法D”】blahblah

如果把A当做是演员的话,B当做好莱坞,那么首先演员A给好莱坞B打了一个电话,然后好莱坞B又反过来联系演员A。

but!第一次调用A CALL B,其实是为了让B call A啊。还是不明白?

情景融入型:

-----------------------------------------以下是背景----------------------------------------------

好莱坞很牛,演员都很想进,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类之间的关系,所以看下来还是云里雾里的,至于回调有什么用?可以结合异步来看,请看这篇博文还有这篇还有这篇这篇我还没看,应该也不错。

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

如果各位看完还不懂,抱歉浪费大家的时间了,可以留言讨论。

时间: 2024-08-09 19:51:50

【原】回调机制的相关文章

Java回调机制

以前不理解什么叫回调,天天听人家说加一个回调方法啥的,心里想我草,什么叫回调方法啊?然后自己就在网上找啊找啊找,找了很多也不是很明白,现在知道了,所谓回调:就是A类中调用B类中的某个方法C,然后B类中反过来调用A类中的方法D,D这个方法就叫回调方法,这样子说你是不是有点晕晕的,其实我刚开始也是这样不理解,看了人家说比较经典的回调方式: Class A实现接口CallBack callback——背景1 class A中包含一个class B的引用b ——背景2 class B有一个参数为call

java中的回调机制的理解(小例子)

这样的解释似乎还是比较难懂,这里举个简单的例子,程序员A写了一段程序(程序a),其中预留有回调函数接口,并封装好了该程序.程序员B要让a调用自己的程序b中的一个方法,于是,他通过a中的接口回调自己b中的方法.目的达到.在C/C++中,要用回调函数,被掉函数需要告诉调用者自己的指针地址,但在JAVA中没有指针,怎么办?我们可以通过接口(interface)来实现定义回调函数. 正常情况下开发人员使用已经定义好的API,这个过程叫Call.但是有时这样不能满足需求,就需要程序员注册自己的程序,然后让

java回调机制(写的很好)

以前不理解什么叫回调,天天听人家说加一个回调方法啥的,心里想我草,什么叫回调方法啊?然后自己就在网上找啊找啊找,找了很多也不是很明白,现在知道了,所谓回调:就是A类中调用B类中的某个方法C,然后B类中反过来调用A类中的方法D,D这个方法就叫回调方法,这样子说你是不是有点晕晕的,其实我刚开始也是这样不理解,看了人家说比较经典的回调方式: Class A实现接口CallBack callback——背景1 class A中包含一个class B的引用b ——背景2 class B有一个参数为call

JAVA回调机制(CallBack)详解

序言 最近学习java,接触到了回调机制(CallBack).初识时感觉比较混乱,而且在网上搜索到的相关的讲解,要么一言带过,要么说的比较单纯的像是给CallBack做了一个定义.当然了,我在理解了回调之后,再去看网上的各种讲解,确实没什么问题.但是,对于初学的我来说,缺了一个循序渐进的过程.此处,将我对回调机制的个人理解,按照由浅到深的顺序描述一下,如有不妥之处,望不吝赐教! 开始之前,先想象一个场景:幼稚园的小朋友刚刚学习了10以内的加法. 第1章. 故事的缘起 幼师在黑板上写一个式子 “1

一个经典例子让你彻彻底底理解java回调机制

以前不理解什么叫回调,天天听人家说加一个回调方法啥的,心里想我草,什么叫回调方法啊?然后自己就在网上找啊找啊找,找了很多也不是很明白,现在知道了,所谓回调:就是A类中调用B类中的某个方法C,然后B类中反过来调用A类中的方法D,D这个方法就叫回调方法,这样子说你是不是有点晕晕的,其实我刚开始也是这样不理解,看了人家说比较经典的回调方式: Class A实现接口CallBack callback--背景1 class A中包含一个class B的引用b --背景2 class B有一个参数为call

Java回调机制解析

模块之间总是存在着一定的接口,从接口调用方式上看,可以分为三类:同步调用.回调和异步调用.同步调用是一种阻塞式调用,也是我们在写程序中经常使用的:回调是一种双向的调用模式,也就是说,被调用的接口被调用的同时也会调用对方的接口,这句话可能有点绕,等文章后面举例说明:异步调用是一种类似消息或事件的机制,解决了同步阻塞的问题,举例来讲:A通知B后,他们各走各的路,互不影响,不用像同步调用那样,A通知B后,非得等到B走完后,A才继续走.回调是异步的基本,因此下面着重说回调机制. 我们暂且不讨论回调的一些

接口_ _接口回调机制

在Android中到处可见接口回调机制,尤其是UI事件处理方面,本文给大家介绍android接口回调机制,涉及到android接口回调相关知识,对本文感兴趣的朋友可以参考下本篇文章 在使用接口回调的时候发现了一个经常犯的错误,就是回调函数里面的实现有可能是用多线程或者是异步任务去做的,这就会导致我们期望函数回调完毕去返回一个主函数的结果,实际发现是行不通的,因为如果回调是多线程的话你是无法和主函数同步的,也就是返回的数据是错误的,这是非常隐秘的一个错误.那有什么好的方法去实现数据的线性传递呢?先

JAVA和Android的回调机制

以 前不理解什么叫回调,天天听人家说加一个回调方法啥的,心里想我草,什么叫回调方法啊?然后自己就在网上找啊找啊找,找了很多也不是很明白,现在知道了, 所谓回调:就是A类中调用B类中的某个方法C,然后B类中反过来调用A类中的方法D,D这个方法就叫回调方法,这样子说你是不是有点晕晕的,其实我刚开始 也是这样不理解,看了人家说比较经典的回调方式: Class A实现接口CallBack callback——背景1 class A中包含一个class B的引用b ——背景2 class B有一个参数为c

ios编程之回调机制

ios编程之回调机制详解:   ———————————————— 函数/方法/block块一系列概念: 函数在大部分高级语言中都是个重要的概念,函数实现就是对一段代码的封装,我们一般会为了完成某一个业务功能或编程逻辑而需要组织数行代码,而这数行代码还有可能被使用多次,所以将它们封装成一个函数,每一次的执行我们称之为调函数或函数调用. 在C程序中,我们知道程序是从main函数开始执行,执行完main函数就退出程序,其实我们程序员很少去跟踪整个程序的执行流,一个程序(一段二进制代码)如何从加载到运行