zoukankan      html  css  js  c++  java
  • 【原】回调机制

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

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

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

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

  • 相关阅读:
    查看mysql版本的四种方法及常用命令
    newInstance和new的区别(good)
    Citrix 服务器虚拟化之六 Xenserver虚拟机创建与快照
    Java实现 蓝桥杯 算法训练 排序
    Java实现 蓝桥杯 算法训练 排序
    Java实现 蓝桥杯 算法训练 排序
    Java实现 蓝桥杯 算法训练 2的次幂表示
    Java实现 蓝桥杯 算法训练 2的次幂表示
    Java实现 蓝桥杯 算法训练 前缀表达式
    Java实现 蓝桥杯 算法训练 前缀表达式
  • 原文地址:https://www.cnblogs.com/huntfor/p/4493446.html
Copyright © 2011-2022 走看看