最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java 回調機制的實例詳解

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

java 回調機制的實例詳解

序言

最近接觸到了回調機制(CallBack)。初識時感覺比較混亂,而且在網上搜索到的相關的講解,要么一言帶過,要么說的比較單純的像是給CallBack做了一個定義。當然了,我在理解了回調之后,再去看網上的各種講解,確實沒什么問題。但是,對于初學的我來說,缺了一個循序漸進的過程。此處,將我對回調機制的個人理解,按照由淺到深的順序描述一下,如有不妥之處,望不吝賜教!

開始之前,先想象一個場景:幼稚園的小朋友剛剛學習了10以內的加法。

第1章. 故事的緣起

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

由于已經學習了10以內的加法,小明同學可以完全靠自己來計算這個題目,模擬該過程的代碼如下:

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

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

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

運行結果如下:

小明心算:1 + 1 = 2

該過程完全由Student類的實例對象單獨完成,并未涉及回調機制。

第2章. 幼師的找茬

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

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

計算器的代碼為:

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

運行結果如下:

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

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

3.幼師回來了

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

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

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

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

因此,超級計算器的add方法應該包含兩個操作數和小明自身的引用,代碼如下:

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

小明這邊現在已經不需要心算,也不需要使用計算器了,因此只需要有一個方法可以向小紅尋求幫助就行了,代碼如下:

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

運行結果為:

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

執(zhí)行流程為:小明通過自身的callHelp方法調用了小紅(new SuperCalculator())的add方法,在調用的時候將自身的引用(this)當做參數一并傳入,小紅在使用計算器得出結果之后,回調了小明的fillBlank方法,將結果填在了黑板上的空格里。

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

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

第4章. 門口的婆婆

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

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

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

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

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

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

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

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

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

小明的:

/**
 * Java學習交流QQ群:589809992 我們一起學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 + "求助小紅計算:" + a + " + " + b + " = " + result);
     }

   }

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

老婆婆的:

/**
 * Java學習交流QQ群:589809992 我們一起學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());
  }
}

測試程序如下:

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

運行結果如下:

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

最后的話

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

有人也許會問,為什么老婆婆擺攤能掙那么多錢? 你的關注點有問題好嗎??!這里聊的是回調機制?。?!

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

希望通過本文大家能夠徹底掌握理解這部分內容,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關文章

  • Java使用Geodesy進行地理計算的技術指南

    Java使用Geodesy進行地理計算的技術指南

    在地理信息系統(tǒng) (GIS) 和導航應用中,精確的地理計算是基礎,Geodesy 是一個流行的 Java 庫,用于處理地理位置、距離、方向等相關計算,本博客將介紹 Geodesy 的核心功能,并提供詳細的實踐樣例,幫助開發(fā)者快速上手,需要的朋友可以參考下
    2025-02-02
  • 使用IntelliJ IDEA調式Stream流的方法步驟

    使用IntelliJ IDEA調式Stream流的方法步驟

    本文主要介紹了使用IntelliJ IDEA調式Stream流的方法步驟,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • 使用RestTemplate調用https接口跳過證書驗證

    使用RestTemplate調用https接口跳過證書驗證

    這篇文章主要介紹了使用RestTemplate調用https接口跳過證書驗證,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • maven打包zip包含bin下啟動腳本的完整代碼

    maven打包zip包含bin下啟動腳本的完整代碼

    這篇文章主要介紹了maven打包zip包含bin下啟動腳本,本文給大家講解的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-10-10
  • 詳解static 和 final 和 static final區(qū)別

    詳解static 和 final 和 static final區(qū)別

    這篇文章主要介紹了static 和 final 和 static final區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • java生成xml格式文件的方法

    java生成xml格式文件的方法

    這篇文章主要介紹了java生成xml格式文件的方法,涉及java節(jié)點遍歷與屬性操作的相關技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2016-07-07
  • TKmybatis的框架介紹和原理解析

    TKmybatis的框架介紹和原理解析

    tkmybatis是在mybatis框架的基礎上提供了很多工具,讓開發(fā)更加高效,下面來看看這個框架的基本使用,后面會對相關源碼進行分析,感興趣的同學可以看一下,挺不錯的一個工具
    2020-12-12
  • Java 給PDF簽名時添加可信時間戳的方法

    Java 給PDF簽名時添加可信時間戳的方法

    這篇文章主要介紹了Java 給PDF簽名時添加可信時間戳,關于jar導入的問題,本文給大家?guī)韮煞N方法,一種是手動導入另一種是maven配置導入,需要的朋友可以參考下
    2021-07-07
  • 教你用Springboot實現攔截器獲取header內容

    教你用Springboot實現攔截器獲取header內容

    項目中遇到一個需求,對接上游系統(tǒng)是涉及到需要增加請求頭,請求頭的信息是動態(tài)獲取的,需要動態(tài)從下游拿到之后轉給上游,文中非常詳細的介紹了該需求的實現,需要的朋友可以參考下
    2021-05-05
  • 這么優(yōu)雅的Java ORM沒見過吧!

    這么優(yōu)雅的Java ORM沒見過吧!

    這篇文章主要介紹了Java ORM的相關資料,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2021-01-01

最新評論

鄯善县| 新闻| 调兵山市| 任丘市| 西乌珠穆沁旗| 奉节县| 沁水县| 玉田县| 吉木萨尔县| 新平| 得荣县| 梅州市| 乌兰察布市| 阿鲁科尔沁旗| 凤山市| 墨竹工卡县| 蚌埠市| 德令哈市| 湟中县| 渑池县| 高雄县| 泰和县| 新竹市| 崇义县| 始兴县| 营山县| 乌鲁木齐县| 大厂| 长阳| 靖远县| 神池县| 行唐县| 奇台县| 中山市| 公主岭市| 孟津县| 沾化县| 海伦市| 原平市| 万载县| 巍山|