歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Java 回調與委派機制

在《模擬 Android Button 控件點擊事件》(見 http://www.linuxidc.com/Linux/2011-11/46601.htm)主要說了一下模擬 Android 的 Listener 模式,其實這就是一種委派與回調機制的體現。

委派,從字面上來理解的話,應該是委托其他類做事情而自己不做或者只做一部分工作;而回調,就是調用自己的方法。

這兩種機制很類似,你姑且可以認為它們就是一碼事。

java 中,實現委派和回調都是通過接口來實現的。下面舉個小例子吧!

該例子是這樣的(只是一個例子):

ProfessionalWorker 、SparetimeWorker 負責發射 Rocket,Rocket 類通過接口 IRocketDelegate 委派(或者說是回調) ProfessionalWorker 、SparetimeWorker自己發射。

總之,Rocket不做具體的事情。看實例代碼:

IRocketDelegate.java源碼

  1. package mark.zhang;  
  2.   
  3. public interface IRocketDelegate {  
  4.       
  5.     public abstract long startAtTime();  
  6.       
  7.     public abstract long endAtTime();  
  8.       
  9.     public abstract void sendDidFail();  
  10. }  
共有三個方法,分別是用於計算 Rocket 發射時間、計算 Rocket 發射完畢的時間以及發送是否失敗的。


Rocket.java源碼

  1. package mark.zhang;  
  2.   
  3. public class Rocket {  
  4.   
  5.     IRocketDelegate delegate = null;  
  6.   
  7.     public Rocket(IRocketDelegate delegate) {  
  8.         this.delegate = delegate;  
  9.     }  
  10.   
  11.     private long getRocketStartTime() {  
  12.         long startTime = delegate.startAtTime();  
  13.         return startTime;  
  14.     }  
  15.   
  16.     private long getRocketEndTime() {  
  17.         long endTime = delegate.endAtTime();  
  18.         return endTime;  
  19.     }  
  20.   
  21.     public boolean isOk() {  
  22.         // 超時0.1秒為失敗   
  23.         if (getRocketEndTime() - getRocketStartTime() >= 100) {  
  24.             delegate.sendDidFail();  
  25.             return false;  
  26.         }  
  27.         return true;  
  28.     }  
  29.   
  30. }  
在這個類中,聲明一個 IRocketDelegate 接口對象,使用該對象調用接口的方法。我們知道,接口不可以直接實例化,換句話說,實例化接口必須實現接口的所有方法。

那麼,我們就把這些實現工作交給具體的發射者來完成。實現回調。

ProfessionalWorker.java源碼

  1. package mark.zhang;  
  2.   
  3. public class ProfessionalWorker implements IRocketDelegate {  
  4.   
  5.     @Override  
  6.     public long startAtTime() {  
  7.         System.out.println("startAtTime is call-back inProfessionalWorker!");  
  8.         return System.currentTimeMillis();  
  9.     }  
  10.   
  11.     @Override  
  12.     public long endAtTime() {  
  13.         System.out.println("endAtTime is call-back in ProfessionalWorker!");  
  14.         return System.currentTimeMillis();  
  15.     }  
  16.   
  17.     @Override  
  18.     public void sendDidFail() {  
  19.         System.out.println("ProfessionalWorker send Rocket fail !");  
  20.     }  
  21.   
  22.     public void send() {  
  23.         if (new Rocket(this).isOk()) {  
  24.             System.out.println("ProfessionalWorker send Rocket ok !");  
  25.         }  
  26.     }  
  27. }  
Copyright © Linux教程網 All Rights Reserved