程序員A寫了一段程序(程序a),其中預留有回調(diào)函數(shù)接口,并封裝好了該程序。程序員B要讓a調(diào)用自己的程序b中的一個方法,于是,他通過a中的接口回調(diào)自己b中的方法。目的達到。在C/C++中,要用回調(diào)函數(shù),被掉函數(shù)需要告訴調(diào)用者自己的指針地址,但在JAVA中沒有指針,怎么辦?我們可以通過接口(interface)來實現(xiàn)定義回調(diào)函數(shù)。
創(chuàng)新互聯(lián)是一家專業(yè)的成都網(wǎng)站建設公司,我們專注成都網(wǎng)站設計、網(wǎng)站制作、網(wǎng)絡營銷、企業(yè)網(wǎng)站建設,友情鏈接,廣告投放為企業(yè)客戶提供一站式建站解決方案,能帶給客戶新的互聯(lián)網(wǎng)理念。從網(wǎng)站結(jié)構(gòu)的規(guī)劃UI設計到用戶體驗提高,創(chuàng)新互聯(lián)力求做到盡善盡美。
假設我是程序員A,以下是我的程序a:
[java] view plaincopyprint?
public class Caller
{
public MyCallInterface mc;
public void setCallfuc(MyCallInterface mc)
{
this.mc= mc;
}
public void call(){
this.mc.method();
}
}
還需要定義一個接口,以便程序員B根據(jù)我的定義編寫程序?qū)崿F(xiàn)接口。
public interface MyCallInterface
{
public void method();
}
于是,程序員B只需要實現(xiàn)這個接口就能達到回調(diào)的目的了:
public class B implements MyCallInterface
{
public void method()
{
System.out.println("回調(diào)");
}
public static void main(String args[])
{
Caller call = new Caller();
call.setCallfuc(new B());
call.call();
}
}
熟悉 MS Windows 和 X Window System 事件驅(qū)動編程模型的開發(fā)人員 習慣于傳遞在某種事件發(fā)生時調(diào)用(即 回調(diào) )的函數(shù)指針 Java 的面向?qū)ο竽P湍壳安⒉恢С址椒ㄖ羔?這樣似乎就不可能使用這種很好的機制 但我們并不是一點辦法都沒有! Java 的接口支持提供了一種獲得回調(diào)的等價功能的機制 其技巧就是 定義一個簡單接口 并在該接口中聲明我們要調(diào)用的方法 例如 假定我們希望在某個事件發(fā)生時得到通知 我們可以定義一個接口 public interface InterestingEvent{// 這僅是一個常規(guī)方法 因此如果需要 // 它可有返回值 也可接收參數(shù) public void interestingEvent ();}這使得我們可以控制實現(xiàn)該接口的類的任何對象 因此 我們不必關(guān)心任何外部類型信息 與在將 C++ 代碼用于 Motif 時使用窗口小部件的數(shù)據(jù)域來容納對象指針的難以控制的 C 函數(shù)相比 這種方法要好得多 發(fā)出事件信號的類必須等待實現(xiàn)了 InterestingEvent 接口的對象 并在適當時候調(diào)用 interestingEvent() 方法 public class EventNotifier{private InterestingEvent ie;private boolean somethingHappened;public EventNotifier (InterestingEvent event){// 保存事件對象以備后用 ie = event;// 還沒有要報告的事件 somethingHappened = false;}// public void doWork (){// 檢查在別處設置的謂詞 if (somethingHappened){// 通過調(diào)用接口的這個方法發(fā)出事件信號 ie interestingEvent ();}// }// }在上例中 我使用 somethingHappened 謂詞來跟蹤是否應觸發(fā)事件 在許多情況下 調(diào)用此方法足以保證向 interestingEvent() 發(fā)出信號 希望接收事件通知的代碼必須實現(xiàn) InterestingEvent 接口 并將自身引用傳遞給事件通知程序 public class CallMe implements InterestingEvent{private EventNotifier en;public CallMe (){// 創(chuàng)建事件通知程序 并將自身引用傳遞給它 en = new EventNotifier (this);}// 為事件定義實際的處理程序 public void interestingEvent (){// 噢!必定發(fā)生了感興趣的事件!// 執(zhí)行某些操作 }// } lishixinzhi/Article/program/Java/JSP/201311/19423
public?class?Caller??
{??
public?MyCallInterface?mc;??
public?void?setCallfuc(MyCallInterface?mc)??
{??
this.mc=?mc;??
}??
public?void?call(){??
this.mc.method();??
}??
}
接口
public?interface?MyCallInterface??
{??
public?void?method();??
}
測試
public?class?B?implements?MyCallInterface??
{??
public?void?method()??
{??
System.out.println("回調(diào)");??
}??
public?static?void?main(String?args[])??
{??
Caller?call?=?new?Caller();??
call.setCallfuc(new?B());??
call.call();??
}??
}