1. 程式人生 > >對JAVA回撥函式的一點理解

對JAVA回撥函式的一點理解

          老王,男,住隔壁,包工頭一名---OLDWang,靠接工程專案過日子,近日老王手頭有點拮据,靠以前的狐朋狗友接到一項政府工程(GovProjectByWang)----鋪路(BuildRoad)。有工程了,老王擼起袖子加油幹起來了,可是老王擅長吃吃喝喝,酒桌交際,核心鋪路只知道大概步驟,具體不知怎麼弄,為了按期完成完成工程,便將工程的核心--鋪路轉給老周(隔壁的鄰居)。老周公司接手後,進行分析研究,啟動工程專案--為老王修路(BuildRoadForWang),程式碼描述如下:

      介面類:BuidRoad   老王給了個大框架,具體怎麼修路不知道

public interface BuildRoad {
    void toBuildRoad();
}
         老周啟動工程:BuildRoadForWang   老周是專業的,負責具體實現鋪路過程(可惜,老周最後還是被老王摘了桃子,哈哈!)
      這裡比擬實現介面的具體方法類並不是最終呼叫具體方法的類。

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("是我親自到現場指導的!");
    	}
    });    
}
}

       執行結果如上圖所示。