亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

妙解Java中的回調(diào)機(jī)制(CallBack)

 更新時間:2016年07月27日 09:37:18   投稿:daisy  
本文以最簡明扼要的例子將Java的回調(diào)機(jī)制介紹給大家,感興趣的朋友可以參考一下。

前言

最近學(xué)習(xí)java,接觸到了回調(diào)機(jī)制(CallBack)。初識時感覺比較混亂,而且在網(wǎng)上搜索到的相關(guān)的講解,要么一言帶過,要么說的比較單純的像是給CallBack做了一個定義。當(dāng)然了,我在理解了回調(diào)之后,再去看網(wǎng)上的各種講解,確實沒什么問題。但是,對于初學(xué)的我來說,缺了一個循序漸進(jìn)的過程。

回調(diào)是一種雙向調(diào)用模式,什么意思呢,就是說,被調(diào)用方在被調(diào)用時也會調(diào)用對方,這就叫回調(diào)。“If you call me, i will call back”。

不理解?沒關(guān)系,先看看這個可以說比較經(jīng)典的使用回調(diào)的方式:

class A實現(xiàn)接口InA ——背景1

class A中包含一個class B的引用b ——背景2

class B有一個參數(shù)為InA的方法test(InA a) ——背景3

A的對象a調(diào)用B的方法傳入自己,test(a) ——這一步相當(dāng)于you call me

然后b就可以在test方法中調(diào)用InA的方法 ——這一步相當(dāng)于i call you back

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

下面,將我對回調(diào)機(jī)制的個人理解,按照由淺到深的順序描述一下,如有不妥之處,望不吝賜教!

第1章. 故事的緣起

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

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

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)的時候,直接心算(clacADD)了一下,得出結(jié)果是2,并將結(jié)果寫在空格里。測試代碼如下:

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

運行結(jié)果如下:

小明心算:1 + 1 = 2

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

第2章. 幼師的找茬

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

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

計算器的代碼為:

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

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

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 + "使用計算器:" + a + " + " + b + " = " + result);
  }
 }

測試代碼如下:

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

運行結(jié)果如下:

小明使用計算器:168 + 291 = 459

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

3. 幼師回來了

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

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

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

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

因此,超級計算器的add方法應(yīng)該包含兩個操作數(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)不需要心算,也不需要使用計算器了,因此只需要有一個方法可以向小紅尋求幫助就行了,代碼如下:

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 + "求助小紅計算:" + a + " + " + b + " = " + result);
  }
 }

測試代碼如下:

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

運行結(jié)果為:

小明求助小紅計算:26549 + 16487 = 43036

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

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

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

第4章. 門口的婆婆

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

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

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

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

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

因為靈感來自幫小明填空,因此小紅保留了初心,把所有業(yè)務(wù)都當(dāng)做填空(fillBlank)來做。

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

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

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

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 + "求助小紅計算:" + a + " + " + b + " = " + result);
   }

  }

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

老婆婆的:

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());
 }
}

測試程序如下:

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);
 }
}

運行結(jié)果如下:

小明求助小紅計算:56 + 31 = 87

老婆婆求助小紅算賬:26497 + 11256 = 37753元

總結(jié)

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

有人也許會問,為什么老婆婆擺攤能掙那么多錢? 你的關(guān)注點有問題好嗎?。∵@里聊的是回調(diào)機(jī)制?。?!

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

以上就是本文對于Java中的回調(diào)機(jī)制(CallBack) 的有趣詳解,希望給大家學(xué)習(xí)java有所幫助。也謝謝大家對腳本之家的支持。

相關(guān)文章

  • Java類獲取Spring中bean的5種方式

    Java類獲取Spring中bean的5種方式

    這篇文章主要為大家詳細(xì)介紹了Java類獲取Spring中bean的5種方式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-03-03
  • 從最基本的Java工程搭建SpringMVC+SpringDataJPA+Hibernate

    從最基本的Java工程搭建SpringMVC+SpringDataJPA+Hibernate

    本文會介紹從一個最基本的java工程,到Web工程,到集成Spring、SpringMVC、SpringDataJPA+Hibernate,本文介紹的非常詳細(xì),具有參考借鑒價值,感興趣的朋友一起學(xué)習(xí)吧
    2016-05-05
  • java基于swing實現(xiàn)的連連看代碼

    java基于swing實現(xiàn)的連連看代碼

    這篇文章主要介紹了java基于swing實現(xiàn)的連連看代碼,包含了游戲中涉及的事件處理與邏輯功能,需要的朋友可以參考下
    2014-11-11
  • ZooKeeper命令及JavaAPI操作代碼

    ZooKeeper命令及JavaAPI操作代碼

    ZooKeeper是一個樹形目錄服務(wù),其數(shù)據(jù)模型和Uiix的文件目錄樹很類似,擁有一個層次化結(jié)構(gòu),這篇文章主要介紹了ZooKeeper命令及JavaAPI操作代碼,需要的朋友可以參考下
    2023-03-03
  • Java簡單實現(xiàn)動態(tài)代理模式過程解析

    Java簡單實現(xiàn)動態(tài)代理模式過程解析

    這篇文章主要介紹了Java動態(tài)代理模式簡單案例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-07-07
  • Java中HTTP接口請求重試的實現(xiàn)方式

    Java中HTTP接口請求重試的實現(xiàn)方式

    HTTP接口請求重試是指在請求失敗時,再次發(fā)起請求的機(jī)制,在實際應(yīng)用中,由于網(wǎng)絡(luò)波動、服務(wù)器故障等原因,HTTP接口請求可能會失敗,為了保證系統(tǒng)的可用性和穩(wěn)定性,需要對HTTP接口請求進(jìn)行重試,所以本文給大家介紹了HTTP接口請求重試的實現(xiàn)方式,需要的朋友可以參考下
    2024-01-01
  • Java使用junit框架進(jìn)行代碼測試過程詳解

    Java使用junit框架進(jìn)行代碼測試過程詳解

    單元測試就是針對最小的功能單元編寫測試代碼,Junit是使用Java語言實現(xiàn)的單元測試框架,它是開源的,Java開發(fā)者都應(yīng)當(dāng)學(xué)習(xí)并使用Junit編寫單元測試。本文就來講講Junit框架的使用教程,需要的可以參考一下
    2023-02-02
  • 詳解Java中l(wèi)og4j.properties配置與加載應(yīng)用

    詳解Java中l(wèi)og4j.properties配置與加載應(yīng)用

    這篇文章主要介紹了 log4j.properties配置與加載應(yīng)用的相關(guān)資料,需要的朋友可以參考下
    2018-02-02
  • java中使用dom4j解析XML文件的方法教程

    java中使用dom4j解析XML文件的方法教程

    在最近的開發(fā)中用到了dom4j來解析xml文件,所以便有了這篇文章,本文主要給大家介紹了關(guān)于java中使用dom4j解析XML文件的方法教程,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2018-09-09
  • Java中枚舉類enum的values()方法舉例詳解

    Java中枚舉類enum的values()方法舉例詳解

    這篇文章主要給大家介紹了關(guān)于Java中枚舉類enum的values()方法舉例詳解,作為一種常用方法,可以在枚舉中對數(shù)組里的枚舉值進(jìn)行遍歷,這就是values()方法的使用,需要的朋友可以參考下
    2023-11-11

最新評論