一、概念
對回呼函式的概念一直不清晰,看過兩次,時間一長就忘光了,因此在這篇文章中針對Java中的回呼函式及其相關內容進行梳理總結,
記得以前剛接觸回呼函式是在異步IO中,作業系統將資料從內核空間復制到用戶空間時會通過回呼函式通知行程對資料進行處理,因此當時下意識的以為是執行緒間的一種通信機制;再后來顧名思義以為就是一個函式A呼叫函式B,執行B中的內容時會對A產生反饋,指導函式A的走向,
定義:回呼函式被當成引數傳遞給中間函式,因此在傳入一個回呼函式之前,中間函式是不完整的,主函式在呼叫中間函式時,需要先執行回呼函式,通過傳入不同的回呼函式,可以決定和改變中間函式的行為,
可見回呼函式的呼叫是三個函式之間的關系,而不是想當然的兩個函式,這三個函式分別是:主函式(呼叫函式)、中間函式和回呼函式,下面的圖片1-1,可以說明三個函式之間的關系,

圖1-1三個函式的呼叫關系圖
為了防止以后不清楚再多說幾句,主函式A在呼叫中間函式B時,需要將回呼函式C作為B引數傳入,因此在B函式體中走到要執行的特定位置時就會呼叫C來進行處理,因此C不但能監視B執行的位置(運行狀態),而且能干預B的運行,而C作為引數傳入由B呼叫與由B直接呼叫的區別就是:前者只有A在呼叫B的時候才能確定C的內容,后者在程式編譯或者寫完時就已經確定C的內容了,前者因此更具靈活性,因此,回呼函式其實就是多型的應用,能實作運行中的動態系結,
二、實作
回呼函式有同步和異步兩種方式,現在我們將分別用Java陳述句來對其的呼叫程序進行實作,
2.1同步模式
首先回呼函式我們最好設計為一個介面,這樣便于擴展
|
public interface CallBack { //回呼函式checkWork,學生完成作業后 void checkWork(); } |
然后設計中間函式
|
class Student{ int a =1,b=2,c; Boolean flag; //中間函式doWork public void doWork(CallBack callback) { System.out.println("學生開始做作業,,,"); c=4;//學生開始做計算題,并得出結果 System.out.println("學生作業完成,通知老師檢查"); callback.checkWork(); if(flag) { System.out.println("結果正確,學生回家,,"); }else { System.out.println("結果不正確,繼續修改,,"); }}} |
最后由主函式進行呼叫
|
public class Test { public static void main(String[] args){ System.out.println("老師布置作業,,"); Student student = new Student(); student.doWork(new CallBack(){ @Override public void checkWork() { if(student.c==3) { student.flag=true; }else { student.flag=false; }}}); System.out.println("老師回家了,,,"); } } |
呼叫程序如下:主函式呼叫中間函式即學生開始做作業計算a+b的值,完成之后通知老師即中間函式呼叫回呼函式進行處理,將影響中間函式的走向,根據處理結果決定學生是否可以回家,
執行結果如下:
|
老師布置作業,, 學生開始做作業,,, 學生作業完成,通知老師檢查 結果不正確,繼續修改,, 老師回家了,,, |
2.2異步模式
中間函式與回呼函式保持不變,在主函式開一個執行緒進行函式的呼叫,
|
public class Test { public static void main(String[] args){ System.out.println("老師布置作業,,"); //開啟一個新的執行緒,將呼叫程序放入其中執行 //主執行緒可以繼續向下執行 Runnable runnable = new Runnable() { @Override public void run() { Student student = new Student(); student.doWork(new CallBack(){ @Override public void checkWork() { if(student.c==3) { student.flag=true; }else { student.flag=false; }}}); }}; Thread t = new Thread(runnable); t.start(); System.out.println("老師回家了,,,"); }} |
執行結果如下:
|
老師布置作業,, 老師回家了,,, 學生開始做作業,,, 學生作業完成,通知老師檢查 結果不正確,繼續修改,, |
總之,回呼模式在生活中的例子非常常見,在編程中最常見的就是各種GUI編程里面的按鈕點擊什么的,通過回呼可以將控制權轉移,配合上異步模式,可以讓系統設計的更加優雅,
參考文獻:https://www.zhihu.com/question/19801131/answer/27459821
https://mp.weixin.qq.com/s/xn0Pa_Ilp0FjL_N_aswZtQ
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/159466.html
標籤:Java
上一篇:Collection
