Java callback-JAVA實現回調

來源:互聯網
上載者:User
文章目錄
  • Java支援interface,通過interface可以實現相同的回調。其訣竅就在於定義一個簡單的interface,申明一個被希望回調的方法。
  • 當然,也可以在事件管理或事件通知者類中,通過註冊的方式來註冊多個對此事件感興趣的對象。

 

所謂回調,就是客戶程式C調用服務程式S中的某個函數SA,然後S又在某個時候反過來調用C中的某個函數CB,對於C來說,這個CB便叫做回呼函數。例如Win32下的視窗過程函數就是一個典型的回呼函數。一般說來,C不會自己調用CB,C提供CB的目的就是讓S來調用它,而且是C不得不提供。由於S並不知道C提供的CB姓甚名誰,所以S會約定B的介面規範(函數原型),然後由C提前通過S的一個函數R告訴S自己將要使用CB函數,這個過程稱為回呼函數的註冊,R稱為註冊函數。Web Service以及Java的RMI都用到回調機制,可以訪問遠程伺服器程式。


一個通俗的例子。某天,我打電話向你請教問題,當然是個難題,^_^,你一時想不出解決方案,我又不能拿著電話在那裡傻等,於是我們約定:等你想出辦法後打手機通知我,這樣,我就掛掉電話辦其它事情去了。過了XX分鐘,My Phone響了,你興高采烈的說問題已經搞定,應該如此這般處理。故事到此結束。這個例子說明了“非同步+回調”的編程模式。


熟悉MS-Windows和X Windows事件驅動設計模式的開發人員,通常是把一個方法的指標傳遞給事件來源,當某一事件發生時來調用這個方法(也稱為“回調”)。Java的物件導向的模型目前不支援方法指標,似乎不能使用這種方便的機制。

Java支援interface,通過interface可以實現相同的回調。其訣竅就在於定義一個簡單的interface,申明一個被希望回調的方法。

例如,假定當某一事件發生時會得到通知,我們可以定義一個interface:
public interface InterestingEvent {<br /> // 這隻是一個普通的方法,可以接收參數、也可以傳回值<br /> public void interestingEvent();<br />}

這樣我們就有了任何一個實現了這個介面類對象的手柄grip。

當一事件發生時,需要通知實現InterestingEvent 介面的對象,並調用interestingEvent() 方法。
class EventNotifier {<br /> private InterestingEvent ie;<br /> private boolean somethingHappened;<br /> public EventNotifier(InterestingEvent event) {<br /> ie = event;<br /> somethingHappened = false;<br /> }<br /> public void doWork() {<br /> if (somethingHappened) {<br /> // 事件發生時,通過調用介面的這個方法來通知<br /> ie.interestingEvent();<br /> }<br /> }<br />}

在這個例子中,用somethingHappened 來標誌事件是否發生。

希望接收事件通知的類必須要實現InterestingEvent 介面,而且要把自己的引用傳遞給事件的通知者。
public class CallMe implements InterestingEvent {<br /> private EventNotifier en;<br /> public CallMe() {<br /> // 建立一個事件通知者對象,並把自己傳遞給它<br /> en = new EventNotifier(this);<br /> }<br /> // 實現事件發生時,實際處理事件的方法<br /> public void interestingEvent() {<br /> // 這個事件發生了,進行處理<br /> }<br />}

以上是通過一個非常簡單的例子來說明Java中的回調的實現。

當然,也可以在事件管理或事件通知者類中,通過註冊的方式來註冊多個對此事件感興趣的對象。1. 定義一個介面 InterestingEvent ,回調方法 nterestingEvent(String event) 簡單接收一個 String 參數。

interface InterestingEvent {<br /> public void interestingEvent(String event);<br />} 

2. 實現InterestingEvent介面,事件處理類

class CallMe implements InterestingEvent {<br /> private String name;<br /> public CallMe(String name){<br /> this.name = name;<br /> }<br /> public void interestingEvent(String event) {<br /> System.out.println(name + ":[" +event + "] happened");<br /> }<br />} 

3. 事件管理者,或事件通知者

class EventNotifier {<br /> private List<CallMe> callMes = new ArrayList<CallMe>();</p><p> public void regist(CallMe callMe){<br /> callMes.add(callMe);<br /> }</p><p> public void doWork(){<br /> for(CallMe callMe: callMes) {<br /> callMe.interestingEvent("sample event");<br /> }<br /> }<br />} 

4. 測試

public class CallMeTest {<br /> public static void main(String[] args) {<br /> EventNotifier ren = new EventNotifier();<br /> CallMe a = new CallMe("CallMe A");<br /> CallMe b = new CallMe("CallMe B");<br /> // regiest<br /> ren.regist(a);<br /> ren.regist(b);</p><p> // test<br /> ren.doWork();<br /> }<br />} 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.