在Java中實現回撥過程 (轉)

amyz發表於2007-08-14
在Java中實現回撥過程 (轉)[@more@] 

中實現回撥過程:namespace prefix = o ns = "urn:schemas--com::office" />

在Java使用介面來實現同樣功能的回撥

摘要:

Java介面提供了一個很好的方法來實現回撥函式。如果你習慣於在事件的模型中,透過傳遞函式指標來方法達到目的的話,那麼你就會喜歡這個技巧。

作者:John D. Mitchell

在MS-或者X-Window的事件驅動模型中,當某些事件發生的時候,開發人員已經熟悉透過傳遞函式指標來呼叫處理方法。而在Java的面向的模型中,不能支援這種方法,因而看起來好像排除了使用這種比較舒服的機制,但事實並非如此。

Java的介面提供了一種很好的機制來讓我們達到和回撥相同的效果。這個訣竅就在於定一個簡單的介面,在介面之中定義一個我們希望呼叫的方法。

舉個例子來說,假設當一個事件發生的時候,我們想它被通知,那麼我們定義一個介面:

public interface InterestingEvent

{

  // This is just a regular method so it can return something or

  // take arguments if you like.

  public void interestingEvent ();

}

這就給我們一個控制實現了該介面的所有類的物件的控制點。因此,我們不需要關心任何和自己相關的其它外界的型別資訊。這種方法比C函式更好,因為在C++風格的程式碼中,需要指定一個資料域來儲存物件指標,而Java中這種實現並不需要。

發出事件的類需要物件實現InterestingEvent介面,然後呼叫介面中的interestingEvent ()方法。

public class EventNotifier

{

  private InterestingEvent ie;

private boolean somethingHappened;

  public EventNotifier (InterestingEvent event)

{

// Save the event for later use.

= event;

// Nothing to report yet.

somethingHappened = false;

}

  //... 

  public void doWork ()

{

// Check the predicate, which is set elsewhere.

if (somethingHappened)

  {

  // Signal the even by invoking the interface's method.

  ie.interestingEvent ();

  }

//...

  }

  // ...

}

在這個例子中,我們使用了somethingHappened這個標誌來跟蹤是否事件應該被激發。在許多事例中,被呼叫的方法能夠激發interestingEvent()方法才是正確的。

希望收到事件通知的程式碼必須實現InterestingEvent介面,並且正確的傳遞自身的引用到事件通知器。

public class CallMe implements InterestingEvent

{

private EventNotifier en;

  public CallMe ()

{

// Create the event notifier and pass ourself to it.

en = new EventNotifier (this);

}

  // Define the actual handler for the event.

  public void interestingEvent ()

{

// Wow!  Something really interesting must have occurred!

// Do something...

}

  //...

}

希望這點小技巧能給你帶來方便。

關於作者:

John D. Mitchell在過去的九年內一直做顧問,曾經在Geoworks使用OO語言開發了PDA,興趣於寫,Tcl/Tk和Java系統。和人合著了《Making Sense of Java》,目前從事Java編譯器的工作。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-956797/,如需轉載,請註明出處,否則將追究法律責任。

相關文章