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

詳解 JAVA的回調(diào)機(jī)制CallBack

 更新時(shí)間:2016年04月14日 17:23:05   作者:Bro__超  
最近學(xué)習(xí)java,接觸到了回調(diào)機(jī)制(CallBack)。初識時(shí)感覺比較混亂,而且在網(wǎng)上搜索到的相關(guān)的講解,要么一言帶過,要么說的比較單純的像是給CallBack做了一個(gè)定義,本文給大家介紹JAVA的回調(diào)機(jī)制CallBack,感興趣的朋友一起學(xué)習(xí)

序言

CallBack是回調(diào)的意思,熟悉Windows編程的人對"回調(diào)函數(shù)"這四個(gè)字一定不會陌生,但是Java程序員對它可能就不太了解了。"回調(diào)函數(shù)"或者"回調(diào)方法"是軟件設(shè)計(jì)與開發(fā)中一個(gè)非常重要的概念,掌握"回調(diào)函數(shù)"的思想對程序員來說(不管用哪種語言)是非常必要的。

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

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

第1章. 故事的緣起

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

由于已經(jīng)學(xué)習(xí)了10以內(nèi)的加法,小明同學(xué)可以完全靠自己來計(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;
}
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é)果寫在空格里。測試代碼如下:

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

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

小明心算:1 + 1 = 2

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

第2章. 幼師的找茬

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

花擦!為什么所有老師都跟小明過不去?。棵髅鞒V了好不好!這時(shí)候小明同學(xué)明顯不能再像上面那樣靠心算來完成了,正在懵逼的時(shí)候,班上的小紅同學(xué)遞過來一個(gè)只能計(jì)算加法的計(jì)算器(奸商?。。。?!而小明同學(xué)恰好知道怎么用計(jì)算器,于是通過計(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);
}
} 

測試代碼如下:

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

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

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

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

3. 幼師回來了

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

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

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

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

因此,超級計(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);
}
} 

測試代碼如下:

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

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

小明求助小紅計(jì)算:26549 + 16487 = 43036
執(zhí)行流程為:小明通過自身的callHelp方法調(diào)用了小紅(new SuperCalculator())的add方法,在調(diào)用的時(shí)候?qū)⒆陨淼囊?/p>

(this)當(dāng)做參數(shù)一并傳入,小紅在使用計(jì)算器得出結(jié)果之后,回調(diào)了小明的fillBlank方法,將結(jié)果填在了黑板上的空格里。

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

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

第4章. 門口的婆婆

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

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

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

換句話說,小紅希望以后繼續(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)殪`感來自幫小明填空,因此小紅保留了初心,把所有業(yè)務(wù)都當(dāng)做填空(fillBlank)來做。

同時(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é)果之后的處理辦法,按照之前說的使用內(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 + "求助小紅計(jì)算:" + 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 = ;
int b = ;
int c = ;
int d = ;
Student s = new Student("小明");
Seller s = new Seller("老婆婆");
s.callHelp(a, b);
s.callHelp(c, d);
}
}

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

小明求助小紅計(jì)算:56 + 31 = 87

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

最后的話

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

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

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

相關(guān)文章

  • Spring中事務(wù)幾個(gè)常見的問題解決

    Spring中事務(wù)幾個(gè)常見的問題解決

    這篇文章主要介紹了Spring中事務(wù)幾個(gè)常見的問題解決,事務(wù)這個(gè)概念是數(shù)據(jù)庫層面的,Spring只是基于數(shù)據(jù)庫中的事務(wù)進(jìn)行擴(kuò)展,以及提供了一些能讓程序員更新方便操作事務(wù)的方式
    2022-08-08
  • SpringBoot配置文件啟動(dòng)加載順序的方法步驟

    SpringBoot配置文件啟動(dòng)加載順序的方法步驟

    SpringBoot的啟動(dòng)加載順序涉及多個(gè)步驟和組件,通過分層和優(yōu)先級機(jī)制加載配置文件,確保在啟動(dòng)時(shí)正確配置應(yīng)用程序,本文就來介紹一下SpringBoot配置文件啟動(dòng)加載順序的方法步驟,感興趣的可以了解一下
    2024-11-11
  • Springboot靜態(tài)資源的訪問方法介紹

    Springboot靜態(tài)資源的訪問方法介紹

    最近在做SpringBoot項(xiàng)目的時(shí)候遇到了“白頁”問題,通過查資料對SpringBoot訪問靜態(tài)資源做了總結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • Spring中的底層架構(gòu)核心概念類型轉(zhuǎn)換器詳解

    Spring中的底層架構(gòu)核心概念類型轉(zhuǎn)換器詳解

    這篇文章主要介紹了Spring中的底層架構(gòu)核心概念類型轉(zhuǎn)換器詳解,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-12-12
  • Java四舍五入時(shí)保留指定小數(shù)位數(shù)的五種方式

    Java四舍五入時(shí)保留指定小數(shù)位數(shù)的五種方式

    這篇文章主要介紹了Java四舍五入時(shí)保留指定小數(shù)位數(shù)的五種方式,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-09-09
  • Java中的cglib代理詳解

    Java中的cglib代理詳解

    這篇文章主要介紹了Java中的cglib代理詳解, 代理模式是一種設(shè)計(jì)模式,它可以為其他對象提供一種代理,以控制對該對象的訪問,可以在運(yùn)行時(shí)動(dòng)態(tài)地創(chuàng)建代理對象,而不需要手動(dòng)編寫代理類的代碼,需要的朋友可以參考下
    2023-09-09
  • Spring MVC整合Kaptcha的具體使用

    Spring MVC整合Kaptcha的具體使用

    Kaptcha 是一個(gè)可高度配置的實(shí)用驗(yàn)證碼生成工具,本文主要介紹了Spring MVC整合Kaptcha的具體使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • Spring Cloud Gateway 記錄請求應(yīng)答數(shù)據(jù)日志操作

    Spring Cloud Gateway 記錄請求應(yīng)答數(shù)據(jù)日志操作

    這篇文章主要介紹了Spring Cloud Gateway 記錄請求應(yīng)答數(shù)據(jù)日志操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • 一文詳解如何在Java中啟動(dòng)線程

    一文詳解如何在Java中啟動(dòng)線程

    今天要跟大家聊一聊Java多線程的原理和使用方式,Java多線程是提高程序性能的重要機(jī)制,了解線程生命周期、同步機(jī)制、線程池和線程間通信等概念,可以幫助我們編寫出高效、可靠的多線程程序,需要的朋友可以參考下
    2024-07-07
  • springboot中RestTemplate發(fā)送HTTP請求的實(shí)現(xiàn)示例

    springboot中RestTemplate發(fā)送HTTP請求的實(shí)現(xiàn)示例

    RestTemplate是一個(gè) spring-web 提供的執(zhí)行HTTP請求的同步阻塞式工具類,本文就來介紹一下RestTemplate發(fā)送HTTP請求,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03

最新評論

顺昌县| 满洲里市| 花垣县| 昌都县| 印江| 克什克腾旗| 昌图县| 鄂托克旗| 绥化市| 左云县| 隆德县| 唐河县| 永康市| 获嘉县| 原平市| 库尔勒市| 淮南市| 宜兰市| 永善县| 苗栗县| 通河县| 荔波县| 竹溪县| 丽水市| 峨眉山市| 屏东县| 巩义市| 津南区| 丹江口市| 北碚区| 嘉鱼县| 赤水市| 湘乡市| 且末县| 北京市| 永顺县| 虹口区| 嫩江县| 三原县| 宁陕县| 清新县|