正題,談回調函數 (Callback)
解釋(引用于百度百科):
回調函數就是一個通過函數指針調用的函數。如果你把函數的指針(地址)作為參數傳遞給另一個函數,當這個指針被用來調用其所
指向的函數時,我們就說這是回調函數。回調函數不是由該函數的實現方直接調用,而是在特定的事件或條件發生時由另外的一方調
用的,用于對該事件或條件進行響應。
機制(引用于百度百科):
⑴定義一個回調函數;
⑵提供函數實現的一方在初始化的時候,將回調函數的函數指針注冊給調用者;
⑶當特定的事件或條件發生的時候,調用者使用函數指針調用回調函數對事件進行處理。
意義(個人理解):
調用者和被調用者的關系簡單化,互相不用關心對方的邏輯處理,不用關系對方都程序是怎么的,只關系返回值,這種基于返回值
的機制很好地使兩者的關系簡單,明了。
上代碼,以下講述阿 Ben 去飯堂吃飯的故事
接口 Callback
接口定義事情 Done 了之后應該做些什么
public interface Callback {
public void Done(String str);
}
Ben 類
阿 Ben 餓了,于是要去 have lunch,他叫了 Aunt 幫他煮個飯,調用 Aunt 的 cookMeal 方法,于是 Aunt 就去煮了,至于怎么煮,Ben 就不用管了,只要煮好了,就調用 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 就是煮飯的過程,煮好之后,就把結果(飯菜)返回給主函數(Ben)。
public class Aunt {
String str;
public void cookMeal(Callback callback){
str=" 香噴噴的飯菜來咯 "; // 這個就是煮飯的過程
callback.Done(str);
}
}
測試類
public class test {
/**
* @param args
*/
public static void main(String[] args) {
Aunt class2=new Aunt();
Ben class1=new Ben();
class1.havelunch(class2);
}
}
結果:

剛才阿姨在煮飯的時候,阿 Ben 是傻乎乎地站在那里等,等同于是在陪阿姨做飯,這個就是同步回調。
時間怎么可以這么浪費的呢。下面來看看異步回調。
異步回調
這個時候,阿姨還是規規矩矩地做飯。而啊 Ben,得同時做點事情。所以只需要修改 Ben 類。
public class Ben implements Callback {
public void havelunch(final Aunt aunt){
new Thread(new Runnable() { //new 一個新的線程去做這個事情,并等待返回結果
@Override
public void run() {
aunt.cookMeal(Ben.this);
}
}).start();
play(); // 在阿姨做飯的時候可以玩一會手機先嘛。就不用傻傻地等了,阿姨煮好飯會喊吃的了。
}
public void play(){
System.out.println(" 玩手機,刷微博,朋友圈,聊扣扣 ");
}
@Override
public void Done(String str) {
System.out.println(str);
}
}
結果:

總結:
回調函數就是那么一回事。
今天在一篇 nodejs 的文章看到了一句話是這么說的:
在代碼中,異步編程的直接體現就是回調。異步編程依托于回調來實現,但不能說使用了回調后程序就異步化了。
說的不就是這個道理么。呵呵。