欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java 回調(diào)機(jī)制的實(shí)例詳解

 更新時(shí)間:2017年09月19日 10:45:12   投稿:lqh  
這篇文章主要介紹了java 回調(diào)機(jī)制的實(shí)例詳解的相關(guān)資料,希望通過(guò)本文的示例能幫助到大家理解使用回調(diào)機(jī)制,需要的朋友可以參考下

java 回調(diào)機(jī)制的實(shí)例詳解

序言

最近接觸到了回調(diào)機(jī)制(CallBack)。初識(shí)時(shí)感覺(jué)比較混亂,而且在網(wǎng)上搜索到的相關(guān)的講解,要么一言帶過(guò),要么說(shuō)的比較單純的像是給CallBack做了一個(gè)定義。當(dāng)然了,我在理解了回調(diào)之后,再去看網(wǎng)上的各種講解,確實(shí)沒(méi)什么問(wèn)題。但是,對(duì)于初學(xué)的我來(lái)說(shuō),缺了一個(gè)循序漸進(jìn)的過(guò)程。此處,將我對(duì)回調(diào)機(jī)制的個(gè)人理解,按照由淺到深的順序描述一下,如有不妥之處,望不吝賜教!

開(kāi)始之前,先想象一個(gè)場(chǎng)景:幼稚園的小朋友剛剛學(xué)習(xí)了10以內(nèi)的加法。

第1章. 故事的緣起

幼師在黑板上寫(xiě)一個(gè)式子 “1 + 1 = ”,由小明同學(xué)來(lái)填空。

由于已經(jīng)學(xué)習(xí)了10以內(nèi)的加法,小明同學(xué)可以完全靠自己來(lái)計(jì)算這個(gè)題目,模擬該過(guò)程的代碼如下:

public class Student
 {
   private String name = null;

   public Student(String name)
   {
     // TODO Auto-generated constructor stub
     this.name = name;
   }

   public void setName(String name)
   {
     this.name = name;
   }

   private int calcADD(int a, int b)
   {
     return a + b;
   }

   public void fillBlank(int a, int b)
   {
     int result = calcADD(a, b);
     System.out.println(name + "心算:" + a + " + " + b + " = " + result);
   }
 }

小明同學(xué)在填空(fillBalnk)的時(shí)候,直接心算(clacADD)了一下,得出結(jié)果是2,并將結(jié)果寫(xiě)在空格里。測(cè)試代碼如下:

public class Test
 {
   public static void main(String[] args)
   {
    int a = 1;
     int b = 1;
     Student s = new Student("小明");
     s.fillBlank(a, b);
   }
 }

運(yùn)行結(jié)果如下:

小明心算:1 + 1 = 2

該過(guò)程完全由Student類的實(shí)例對(duì)象單獨(dú)完成,并未涉及回調(diào)機(jī)制。

第2章. 幼師的找茬

課間,幼師突發(fā)奇想在黑板上寫(xiě)了“168 + 291 = ”讓小明完成,然后回辦公室了。

花擦!為什么所有老師都跟小明過(guò)不去啊?明明超綱了好不好!這時(shí)候小明同學(xué)明顯不能再像上面那樣靠心算來(lái)完成了,正在懵逼的時(shí)候,班上的小紅同學(xué)遞過(guò)來(lái)一個(gè)只能計(jì)算加法的計(jì)算器(奸商?。。。。《∶魍瑢W(xué)恰好知道怎么用計(jì)算器,于是通過(guò)計(jì)算器計(jì)算得到結(jié)果并完成了填空。

計(jì)算器的代碼為:

public class Calculator
 {
   public int add(int a, int b)
   {
     return a + b;
   }
 }

修改Student類,添加使用計(jì)算器的方法:

public class Student
 {
   private String name = null;

   public Student(String name)
   {
     // TODO Auto-generated constructor stub
     this.name = name;
   }

   public void setName(String name)
   {
     this.name = name;
   }

   @SuppressWarnings("unused")
   private int calcADD(int a, int b)
   {
     return a + b;
   }

   private int useCalculator(int a, int b)
   {
     return new Calculator().add(a, b);
   }

   public void fillBlank(int a, int b)
   {
     int result = useCalculator(a, b);
     System.out.println(name + "使用計(jì)算器:" + a + " + " + b + " = " + result);
   }
 }

測(cè)試代碼如下:

public class Test
 {
   public static void main(String[] args)
   {
     int a = 168;
     int b = 291;
     Student s = new Student("小明");
     s.fillBlank(a, b);
   }
 }

運(yùn)行結(jié)果如下:

小明使用計(jì)算器:168 + 291 = 459

該過(guò)程中仍未涉及到回調(diào)機(jī)制,但是部分小明的部分工作已經(jīng)實(shí)現(xiàn)了轉(zhuǎn)移,由計(jì)算器來(lái)協(xié)助實(shí)現(xiàn)。

3.幼師回來(lái)了

發(fā)現(xiàn)小明完成了3位數(shù)的加法,老師覺(jué)得小明很聰明,是個(gè)可塑之才。于是又在黑板上寫(xiě)下了“26549 + 16487 = ”,讓小明上課之前完成填空,然后又回辦公室了。

小明看著教室外面撒歡兒的小伙伴,不禁悲從中來(lái)。再不出去玩,這個(gè)課間就要廢了啊?。。。?看著小紅再一次遞上來(lái)的計(jì)算器,小明心生一計(jì):讓小紅代勞。

小明告訴小紅題目是“26549 + 16487 = ”,然后指出填寫(xiě)結(jié)果的具體位置,然后就出去快樂(lè)的玩耍了。

這里,不把小紅單獨(dú)實(shí)現(xiàn)出來(lái),而是把這個(gè)只能算加法的計(jì)算器和小紅看成一個(gè)整體,一個(gè)會(huì)算結(jié)果還會(huì)填空的超級(jí)計(jì)算器。這個(gè)超級(jí)計(jì)算器需要傳的參數(shù)是兩個(gè)加數(shù)和要填空的位置,而這些內(nèi)容需要小明提前告知,也就是小明要把自己的一部分方法暴漏給小紅,最簡(jiǎn)單的方法就是把自己的引用和兩個(gè)加數(shù)一塊告訴小紅。

因此,超級(jí)計(jì)算器的add方法應(yīng)該包含兩個(gè)操作數(shù)和小明自身的引用,代碼如下:

public class SuperCalculator
 {
   public void add(int a, int b, Student xiaoming)
   {
     int result = a + b;
     xiaoming.fillBlank(a, b, result);
   }
 }

小明這邊現(xiàn)在已經(jīng)不需要心算,也不需要使用計(jì)算器了,因此只需要有一個(gè)方法可以向小紅尋求幫助就行了,代碼如下:

public class Student
 {
   private String name = null;

   public Student(String name)
   {
     // TODO Auto-generated constructor stub
     this.name = name;
   }

   public void setName(String name)
   {
     this.name = name;
   }

   public void callHelp (int a, int b)
   {
     new SuperCalculator().add(a, b, this);
   }

   public void fillBlank(int a, int b, int result)
   {
     System.out.println(name + "求助小紅計(jì)算:" + a + " + " + b + " = " + result);
   }
 }

測(cè)試代碼如下:

public class Test
 {
   public static void main(String[] args)
   {
     int a = 26549;
     int b = 16487;
     Student s = new Student("小明");
     s.callHelp(a, b);
   }
 }

運(yùn)行結(jié)果為:

小明求助小紅計(jì)算:26549 + 16487 = 43036

執(zhí)行流程為:小明通過(guò)自身的callHelp方法調(diào)用了小紅(new SuperCalculator())的add方法,在調(diào)用的時(shí)候?qū)⒆陨淼囊茫╰his)當(dāng)做參數(shù)一并傳入,小紅在使用計(jì)算器得出結(jié)果之后,回調(diào)了小明的fillBlank方法,將結(jié)果填在了黑板上的空格里。

燈燈燈!到這里,回調(diào)功能就正式登場(chǎng)了,小明的fillBlank方法就是我們常說(shuō)的回調(diào)函數(shù)。

通過(guò)這種方式,可以很明顯的看出,對(duì)于完成老師的填空題這個(gè)任務(wù)上,小明已經(jīng)不需要等待到加法做完且結(jié)果填寫(xiě)在黑板上才能去跟小伙伴們?nèi)鰵g了,填空這個(gè)工作由超級(jí)計(jì)算器小紅來(lái)做了。回調(diào)的優(yōu)勢(shì)已經(jīng)開(kāi)始體現(xiàn)了。

第4章. 門(mén)口的婆婆

幼稚園的門(mén)口有一個(gè)頭發(fā)花白的老婆婆,每天風(fēng)雨無(wú)阻在那里擺著地?cái)傎u(mài)一些快過(guò)期的垃圾食品。由于年紀(jì)大了,腦子有些糊涂,經(jīng)常算不清楚自己掙了多少錢(qián)。有一天,她無(wú)意間聽(tīng)到了小明跟小伙伴們吹噓自己如何在小紅的幫助下與幼師斗智斗勇。于是,婆婆決定找到小紅牌超級(jí)計(jì)算器來(lái)做自己的小幫手,并提供一包衛(wèi)龍辣條作為報(bào)酬。小紅經(jīng)不住誘惑,答應(yīng)了。

回看一下上一章的代碼,我們發(fā)現(xiàn)小紅牌超級(jí)計(jì)算器的add方法需要的參數(shù)是兩個(gè)整型變量和一個(gè)Student對(duì)象,但是老婆婆她不是學(xué)生,是個(gè)小商販啊,這里肯定要做修改。這種情況下,我們很自然的會(huì)想到繼承和多態(tài)。如果讓小明這個(gè)學(xué)生和老婆婆這個(gè)小商販從一個(gè)父類進(jìn)行繼承,那么我們只需要給小紅牌超級(jí)計(jì)算器傳入一個(gè)父類的引用就可以啦。

不過(guò),實(shí)際使用中,考慮到j(luò)ava的單繼承,以及不希望把自身太多東西暴漏給別人,這里使用從接口繼承的方式配合內(nèi)部類來(lái)做。

換句話說(shuō),小紅希望以后繼續(xù)向班里的小朋友們提供計(jì)算服務(wù),同時(shí)還能向老婆婆提供算賬服務(wù),甚至以后能夠拓展其他人的業(yè)務(wù),于是她向所有的顧客約定了一個(gè)辦法,用于統(tǒng)一的處理,也就是自己需要的操作數(shù)和做完計(jì)算之后應(yīng)該怎么做。這個(gè)統(tǒng)一的方法,小紅做成了一個(gè)接口,提供給了大家,代碼如下:

public interface doJob
 {
   public void fillBlank(int a, int b, int result);
 }

因?yàn)殪`感來(lái)自幫小明填空,因此小紅保留了初心,把所有業(yè)務(wù)都當(dāng)做填空(fillBlank)來(lái)做。

同時(shí),小紅修改了自己的計(jì)算器,使其可以同時(shí)處理不同的實(shí)現(xiàn)了doJob接口的人,代碼如下:

public class SuperCalculator
 {
   public void add(int a, int b, doJob customer)
   {
     int result = a + b;
     customer.fillBlank(a, b, result);
   }
 }

小明和老婆婆拿到這個(gè)接口之后,只要實(shí)現(xiàn)了這個(gè)接口,就相當(dāng)于按照統(tǒng)一的模式告訴小紅得到結(jié)果之后的處理辦法,按照之前說(shuō)的使用內(nèi)部類來(lái)做,代碼如下:

小明的:

/**
 * Java學(xué)習(xí)交流QQ群:589809992 我們一起學(xué)Java!
 */
public class Student
 {
   private String name = null;

   public Student(String name)
   {
     // TODO Auto-generated constructor stub
     this.name = name;
   }

   public void setName(String name)
   {
     this.name = name;
   }

   public class doHomeWork implements doJob
   {

     @Override
     public void fillBlank(int a, int b, int result)
     {
       // TODO Auto-generated method stub
       System.out.println(name + "求助小紅計(jì)算:" + a + " + " + b + " = " + result);
     }

   }

   public void callHelp (int a, int b)
   {
     new SuperCalculator().add(a, b, new doHomeWork());
   }
 }

老婆婆的:

/**
 * Java學(xué)習(xí)交流QQ群:589809992 我們一起學(xué)Java!
 */
public class Seller
{
  private String name = null;

  public Seller(String name)
  {
    // TODO Auto-generated constructor stub
    this.name = name;
  }

  public void setName(String name)
  {
    this.name = name;
  }

  public class doHomeWork implements doJob
  {

    @Override
    public void fillBlank(int a, int b, int result)
    {
      // TODO Auto-generated method stub
      System.out.println(name + "求助小紅算賬:" + a + " + " + b + " = " + result + "元");
    }

  }

  public void callHelp (int a, int b)
  {
    new SuperCalculator().add(a, b, new doHomeWork());
  }
}

測(cè)試程序如下:

public class Test
{
  public static void main(String[] args)
  {
    int a = 56;
    int b = 31;
    int c = 26497;
    int d = 11256;
    Student s1 = new Student("小明");
    Seller s2 = new Seller("老婆婆");

    s1.callHelp(a, b);
    s2.callHelp(c, d);
  }
}

運(yùn)行結(jié)果如下:

小明求助小紅計(jì)算:56 + 31 = 87
老婆婆求助小紅算賬:26497 + 11256 = 37753元

最后的話

可以很明顯的看到,小紅已經(jīng)把這件事情當(dāng)做一個(gè)事業(yè)來(lái)做了,看她給接口命的名字doJob就知道了。

有人也許會(huì)問(wèn),為什么老婆婆擺攤能掙那么多錢(qián)? 你的關(guān)注點(diǎn)有問(wèn)題好嗎!!這里聊的是回調(diào)機(jī)制啊?。?/p>

我只知道,后來(lái)小紅的業(yè)務(wù)不斷擴(kuò)大,終于在幼稚園畢業(yè)之前,用掙到的錢(qián)買(mǎi)了人生的第一套房子。

希望通過(guò)本文大家能夠徹底掌握理解這部分內(nèi)容,感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

相關(guān)文章

  • java包本質(zhì)及命名規(guī)范詳解

    java包本質(zhì)及命名規(guī)范詳解

    這篇文章主要介紹了java包本質(zhì)及命名規(guī)范,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • JAVA熔斷和降級(jí)真實(shí)關(guān)系的圖文詳解

    JAVA熔斷和降級(jí)真實(shí)關(guān)系的圖文詳解

    這篇文章主要介紹了Java熔斷和降級(jí)的關(guān)系,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • 深入理解java中for和foreach循環(huán)

    深入理解java中for和foreach循環(huán)

    下面小編就為大家?guī)?lái)一篇深入理解java中for和foreach循環(huán)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-07-07
  • Java中的裝箱和拆箱深入理解

    Java中的裝箱和拆箱深入理解

    裝箱和拆箱是java中老生常談的問(wèn)題,下面小編通過(guò)本文給大家介紹java裝箱和拆箱最基本的東西,感興趣的朋友一起看下吧
    2016-07-07
  • Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(35)

    Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(35)

    下面小編就為大家?guī)?lái)一篇Java基礎(chǔ)的幾道練習(xí)題(分享)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,希望可以幫到你
    2021-07-07
  • 學(xué)習(xí)Java的9張思維導(dǎo)圖

    學(xué)習(xí)Java的9張思維導(dǎo)圖

    這篇文章主要為大家詳細(xì)介紹了學(xué)習(xí)Java的9張思維導(dǎo)圖,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • SpringBoot之logback-spring.xml不生效的解決方法

    SpringBoot之logback-spring.xml不生效的解決方法

    這篇文章主要介紹了SpringBoot之logback-spring.xml不生效的解決方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • 深入Java注解原理Annotation

    深入Java注解原理Annotation

    這篇文章主要介紹了深入Java注解原理Annotation,注解可以附加在package,class,method,field等上面,可相當(dāng)于添加了額外的輔助信息,可以通過(guò)反射機(jī)制編程實(shí)現(xiàn)對(duì)這些元數(shù)據(jù)的訪問(wèn),需要的朋友可以參考下
    2023-10-10
  • springboot 基于Tomcat容器的自啟動(dòng)流程分析

    springboot 基于Tomcat容器的自啟動(dòng)流程分析

    這篇文章主要介紹了springboot 基于Tomcat容器的自啟動(dòng)流程分析,Spring通過(guò)注解導(dǎo)入Bean大體可分為四種方式,我們主要來(lái)說(shuō)Import的兩種實(shí)現(xiàn)方法,需要的朋友可以參考下
    2020-02-02
  • springmvc Controller方法沒(méi)有加@ResponseBody導(dǎo)致api訪問(wèn)404問(wèn)題

    springmvc Controller方法沒(méi)有加@ResponseBody導(dǎo)致api訪問(wèn)404問(wèn)題

    這篇文章主要介紹了springmvc Controller方法沒(méi)有加@ResponseBody導(dǎo)致api訪問(wèn)404問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01

最新評(píng)論