正題纱烘,談回調(diào)函數(shù) (Callback)
解釋(引用于百度百科):
回調(diào)函數(shù)就是一個(gè)通過(guò)函數(shù)指針調(diào)用的函數(shù)。如果你把函數(shù)的指針(地址)作為參數(shù)傳遞給另一個(gè)函數(shù)祈餐,當(dāng)這個(gè)指針被用來(lái)調(diào)用其所
指向的函數(shù)時(shí)擂啥,我們就說(shuō)這是回調(diào)函數(shù)》簦回調(diào)函數(shù)不是由該函數(shù)的實(shí)現(xiàn)方直接調(diào)用哺壶,而是在特定的事件或條件發(fā)生時(shí)由另外的一方調(diào)
用的,用于對(duì)該事件或條件進(jìn)行響應(yīng)蜒谤。
機(jī)制(引用于百度百科):
⑴定義一個(gè)回調(diào)函數(shù)变骡;
⑵提供函數(shù)實(shí)現(xiàn)的一方在初始化的時(shí)候,將回調(diào)函數(shù)的函數(shù)指針注冊(cè)給調(diào)用者芭逝;
⑶當(dāng)特定的事件或條件發(fā)生的時(shí)候,調(diào)用者使用函數(shù)指針調(diào)用回調(diào)函數(shù)對(duì)事件進(jìn)行處理渊胸。
意義(個(gè)人理解):
調(diào)用者和被調(diào)用者的關(guān)系簡(jiǎn)單化旬盯,互相不用關(guān)心對(duì)方的邏輯處理,不用關(guān)系對(duì)方都程序是怎么的翎猛,只關(guān)系返回值胖翰,這種基于返回值
的機(jī)制很好地使兩者的關(guān)系簡(jiǎn)單,明了切厘。
上代碼萨咳,以下講述阿 Ben 去飯?zhí)贸燥埖墓适?/p>
接口 Callback
接口定義事情 Done 了之后應(yīng)該做些什么
public
interface
Callback {
public
void
Done(String str);
}
Ben 類
阿 Ben 餓了,于是要去 have lunch疫稿,他叫了 Aunt 幫他煮個(gè)飯培他,調(diào)用 Aunt 的 cookMeal 方法鹃两,于是 Aunt 就去煮了,至于怎么煮舀凛,Ben 就不用管了俊扳,只要煮好了,就調(diào)用 Done猛遍,給飯阿 Ben 吃就可以了馋记。
public
class
Ben
implements
Callback {
public
void
havelunch(Aunt aunt){
aunt.cookMeal(``this``);
}
@Override
public
void
Done(String str) {
System.out.println(str);
}
}
Aunt 類
賦值給 str 就是煮飯的過(guò)程,煮好之后懊烤,就把結(jié)果(飯菜)返回給主函數(shù)(Ben)梯醒。
public
class
Aunt {
String str;
public
void
cookMeal(Callback callback){
str=``" 香噴噴的飯菜來(lái)咯 "``;
// 這個(gè)就是煮飯的過(guò)程
callback.Done(str);
}
}
測(cè)試類
public
class
test {
/**
* @param args
*/
public
static
void
main(String[] args) {
Aunt class2=``new
Aunt();
Ben class1=``new
Ben();
class1.havelunch(class2);
}
}
剛才阿姨在煮飯的時(shí)候,阿 Ben 是傻乎乎地站在那里等腌紧,等同于是在陪阿姨做飯茸习,這個(gè)就是同步回調(diào)。
時(shí)間怎么可以這么浪費(fèi)的呢寄啼。下面來(lái)看看異步回調(diào)逮光。
異步回調(diào)
這個(gè)時(shí)候,阿姨還是規(guī)規(guī)矩矩地做飯墩划。而啊 Ben涕刚,得同時(shí)做點(diǎn)事情。所以只需要修改 Ben 類乙帮。
public
class
Ben
implements
Callback {
public
void
havelunch(``final
Aunt aunt){
new
Thread(``new
Runnable() {
//new 一個(gè)新的線程去做這個(gè)事情杜漠,并等待返回結(jié)果
@Override
public
void
run() {
aunt.cookMeal(Ben.``this``);
}
}).start();
play();
// 在阿姨做飯的時(shí)候可以玩一會(huì)手機(jī)先嘛。就不用傻傻地等了察净,阿姨煮好飯會(huì)喊吃的了驾茴。
}
public
void
play(){
System.out.println(``" 玩手機(jī),刷微博氢卡,朋友圈锈至,聊扣扣 "``);
}
@Override
public
void
Done(String str) {
System.out.println(str);
}
}
總結(jié):
回調(diào)函數(shù)就是那么一回事。
今天在一篇 nodejs 的文章看到了一句話是這么說(shuō)的:
在代碼中译秦,異步編程的直接體現(xiàn)就是回調(diào)峡捡。異步編程依托于回調(diào)來(lái)實(shí)現(xiàn),但不能說(shuō)使用了回調(diào)后程序就異步化了筑悴。
說(shuō)的不就是這個(gè)道理么们拙。呵呵。
以上是我個(gè)人的理解阁吝,如有錯(cuò)誤砚婆,望指出。