對JAVA回撥函式的一點理解
阿新 • • 發佈:2019-02-17
老王,男,住隔壁,包工頭一名---OLDWang,靠接工程專案過日子,近日老王手頭有點拮据,靠以前的狐朋狗友接到一項政府工程(GovProjectByWang)----鋪路(BuildRoad)。有工程了,老王擼起袖子加油幹起來了,可是老王擅長吃吃喝喝,酒桌交際,核心鋪路只知道大概步驟,具體不知怎麼弄,為了按期完成完成工程,便將工程的核心--鋪路轉給老周(隔壁的鄰居)。老周公司接手後,進行分析研究,啟動工程專案--為老王修路(BuildRoadForWang),程式碼描述如下:
介面類:BuidRoad 老王給了個大框架,具體怎麼修路不知道
老周啟動工程:BuildRoadForWang 老周是專業的,負責具體實現鋪路過程(可惜,老周最後還是被老王摘了桃子,哈哈!)public interface BuildRoad { void toBuildRoad(); }
這裡比擬實現介面的具體方法類並不是最終呼叫具體方法的類。
public class BuildRoadForWang implements BuildRoad {
// 老周為老王費勁心思,鞠躬盡瘁的去鋪路
@Override
public void toBuildRoad() {
System.out.println("鋪路的具體實現:挖路--->填石頭--->澆柏油!!!");
}
}
由於政府對路質量要求較高,派工作組去老王那檢查工作,要求老王彙報鋪路具體實現,因此這老王需要老周告知,然後為了迎接工作組,老王花了心思準備一番:
public class GovProjectByWang { private BuildRoad buildRoad; //老王為迎接工作組,要老週上交付出心血的鋪路方案 //這裡相當於註冊回撥函式,即將介面類作為引數傳入 public void getReportFromZhou(BuildRoad buildRoad){ this.buildRoad=buildRoad; report(); } private void report(){ buildRoad.toBuildRoad(); } }
工作組來了,老王帶著老周的智慧結晶去向工作組彙報了:
public class ReportForGov {
public static void main(String[] args) {
GovProjectByWang project=new GovProjectByWang();
//回撥預設的方法
project.getReportFromZhou(new BuildRoadForWang());
//老王拍著胸口信誓旦旦的說到整個具體實現方案是他自己設計的
//回撥自己實現的方法
project.getReportFromZhou(new BuildRoad(){
@Override
public void toBuildRoad() {
// TODO Auto-generated method stub
System.out.print("是我親自到現場指導的!");
}
});
}
}
執行結果如上圖所示。