Java 回調的概念

回調是一種代碼的編寫方法。我們最正常的編碼邏輯是:
類A需要調用類B的方法b,根據b的返回值,類A再去做一系列賦值啊處理啊之類的工作。
而使用回調的寫法:
類A可以把這些後續處理寫成一個方法a,然後把A的引用傳遞給方法b,方法b在做完工作後,就可以直接用A.a來完成A後續的處理工作。

爲什麼要使用回調呢?下面舉一些例子:
1.ajax的寫法中我們經常會看到callback,因爲發送ajax的請求可能大部分應用可以公用,但是處理請求結果的邏輯每個應用都不一樣。這時候我們可以吧發送請求寫成公共函數,而把處理結果的邏輯寫成回調函數callback,如:ExtAjaxRequestNew(url,param,’callbackfuncName’)。這樣,發送請求的邏輯即統一起來了,易於管理維護。

2.常出現在異步場景,比如類A定義發送消息和接收消息函數。發送消息中,把自己註冊給異步調用的方法。在異步調用結果出來後,就可以根據註冊的那個類得到接收消息函數,從而在此繼續進行後續的工作。

3.結合匿名內部類使用,實現多態性。例如數據庫接口類DBinterface,必須使用fixMethod方法操作數據庫。如果採用繼承和上溯造型的寫法。就必須爲每種操作而創建一個繼承類。

fixMethod(){
    getConn();
    abstract的方法execute();
    closeConn();
}

class DeleteHandle extends DBinterface{
    實現execute方法爲刪除;
}
DBinterface i = new deleteHolder (); 
i.fixMethod();

class AddHandle extends DBinterface{
    實現execute方法爲新增;
}
DBinterface i = new AddHandle (); 
i.fixMethod();

如果使用回調方式,可以把抽象方法execute用一個接口(繼承方式也可以用接口封裝execute而不是使用抽象方法,但只要是用繼承還是得寫很多類)封裝起來,把接口引用通過回調方式註冊給fixMethod()。而execute()的實現,結合匿名內部類來實現。這樣達到多態的目的,效果和繼承方式一樣,但顯然更爲靈活、簡潔和優雅。

interface ExeInterface{ execute();}
Class template(){
    fixMethod(ExeInterface interface){//回調註冊
        getConn();
        interface.execute();//使用回調
        closeConn();
    }

    delete(){
        fixMethod(new ExeInterface(){//使用匿名內部類
            實現execute方法爲刪除;
        })
    }

    add(){
        fixMethod(new ExeInterface(){//使用匿名內部類
            實現execute方法爲新增;
        })
    }

注意事項:
使用回調時,就必須把引用傳遞給調用回調函數的對象,這個動作可以稱爲註冊。如果把這個引用作爲成員變量,那也能實現註冊。但實際場景中,我們很少看到爲了回調一個類的方法,而把這個類作爲成員變量。也很少看到會直接傳遞這個類的引用。這是因爲侵入性太強—-把一個類的引用傳遞,那麼就暴露了這個類裏面的其它對象,可以隨意的使用其它的方法。所以,應該把需要回調的那部分函數抽象成接口,在註冊時傳遞接口的引用,這樣就保護了類的其它部分細節,達到解耦的目的。

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