回調(diào)的意義在于,通過在其他對象中調(diào)用自身類中定義的函數(shù),達到一定的目的(常見于事件注冊,監(jiān)聽以及線程Runnable中的run)。
舉例一:Parent類是接口,自帶oncall函數(shù)(用于被其他任何人電話聯(lián)系),父親類Father實現(xiàn)Parent接口并重寫oncall方法,F(xiàn)ather類帶有成員孩子類Children。Children類自帶方法做作業(yè)doHomework(),做完作業(yè)后孩子應(yīng)該及時電話通知老爸作業(yè)做完了!,因此doHomework中會調(diào)用Parent類的oncall方法告知父親,作業(yè)已經(jīng)完成。整個流程中oncall就是回調(diào)函數(shù),是Father類定義的,被Children中調(diào)用并返回結(jié)果給Father類。
舉例二(觀察者模式):注冊多個對某個事件監(jiān)聽的對象,這些對象由類CallListener實例化獲取(該類實現(xiàn)一個事件發(fā)生的接口Event)。再定義類Notifier,其中維持一個監(jiān)聽對象的數(shù)組,用于一旦事件發(fā)生立即通知各個監(jiān)聽對象,具體處理問題邏輯全在監(jiān)聽類所定義的方法中,與Notifier無關(guān),處理過程的方法是監(jiān)聽類中定義的,即Notifier回調(diào)CallListener中的方法,該方法就是叫做回調(diào)方法。
例二代碼:
//接口,包含回調(diào)函數(shù)聲明
public interface Event{
public void processEvent();
}
//實現(xiàn)接口的回調(diào)方法
public class CallListener implements Event{
private String name;
public CallListener(String name) {
// 新建一個事件通知者對象,并把自己傳遞給它
this.name= name;
}
// 實現(xiàn)事件發(fā)生時,實際處理事件的方法
@override
public void processEvent() {
// 監(jiān)聽到事件發(fā)生了,進行處理
}
}
//傳入包含回調(diào)函數(shù)的對象
class Notifier{
private List callListenerList=new ArrayList();
public void regist(CallListener callListener){
callListenerList.add(callListener);\
}
public void doWork(){
for(CallListener callListener: callListenerList) {
//觸發(fā)回調(diào)函數(shù)
callListener.processEvent("sample event");
}
}
}
測試代碼:
public class Test {
public static void main(String[] args) {
Notifier notifier = new Notifier ();
CallListener a = new CallListener("Listener A");
CallListener b = new CallListener("Listener B");
// 給通知者注冊監(jiān)聽者,并直接啟動通知
notifier.regist(a);
notifier.regist(b);
// 此處回調(diào)監(jiān)聽Listener的processEvent處理事件
notifier.doWork();
}
}