Java回調函數,自己辛苦的理解

關於回調函數,網上雖然有很多解答,但發現很難掌握。你懂得了理論,但實際的應用又顯得不知從何下手。憑着我個人單薄的力量,我總結了一個比較容易理解和應用的例子,通過這個例子的學習,我相信很快就能學會回調函數了。

 

所謂回調,就是客戶程序C調用服務程序S中的某個方法a,然後S又在某個時候反過來調用C中的某個方法b,對於C來說,這個b便叫做回調函數。

一般說來,C不會自己調用b,C提供b的目的就是讓S來調用它,而且是C不得不提供。由於S並不知道C提供的b叫甚名誰,所以S會約定b的接口規範(函數原型),然後由C提前通過S的一個函數r告訴S自己將要使用b函數,這個過程稱爲回調函數的註冊,r稱爲註冊函數。

下面舉個通俗的例子:

某天,我打電話向你請教問題,當然是個難題,:),你一時想不出解決方法,我又不能拿着電話在那裏傻等,於是我們約定:等你想出辦法後打手機通知 我,這樣,我就掛掉電話辦其它事情去了。過了XX分鐘,我的手機響了,你興高采烈的說問題已經搞定,應該如此這般處理。故事到此結束。

這個例子說明了“異步+回調”的編程模式。其中,你後來打手機告訴我結果便是一個“回調”過程;我的手機號碼必須在以前告訴你,這便是註冊回調函數;我的手機號碼應該有效並且手機能夠接收到你的呼叫,這是回調函數必須符合接口規範。

如果你還不太清楚看看這段描述合和代碼:

聲明一個接口,另外一個類有方法裏面有個參數以是這個接口類型的,而後在另外類中實現這個接口(java中多用的是匿名內部類),而且以這個匿名的 類生成的對象爲參數傳到上面提到類中,而後實現回調.......這種用法可以參考java裏面常用到的數據庫操作所用到的幾個接口.....

 

下面是具體的例子:

 

public class SynCallback {
    public static void main(String[] args) {
        DealCallBack dcb = new DealCallBack();
        final String name = "小朋友";
        System.out.println(name+"遇到一個問題,打電話請教我...");
        dcb.Call(name, new DealCallBack.CallBack() {
           
            @Override
            public void callBack() {
                System.out.println(name + "已經得到了很滿意的答案.");
               
            }
        });
    }
}

 

 

public class DealCallBack {

    CallBack cb;
    public void Call(String name, CallBack toWho) {
        System.out.println(name + "問了我一個問題,我一時想不出,讓他先掛電話了,他可以繼續做其它事,等我想到了,回來再告訴他。");
        this.cb = toWho;
        deal(name);  // 處理問題
       
    }
   
    public void deal(String name) {
        System.out.println("我正在處理"+name+"的問題...");
        result(name);   // 得到答案
    }
   
    public void result(String name) {
        System.out.println("我終於找到問題的答案了,馬上通知"+name);
        cb.callBack();  // 回調,通知處理完了,這裏沒有參數,實際當中,callBack一般都是帶參數的,就是這邊處理的結果傳遞給另一邊
    }

    /*

     *  定義好的接口

    */


    public interface CallBack {
        void callBack();
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章