歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Java 回調與委派機制

Java 回調與委派機制

日期:2017/3/1 11:08:32   编辑:Linux編程

在《模擬 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. public interface IRocketDelegate {
  3. public abstract long startAtTime();
  4. public abstract long endAtTime();
  5. public abstract void sendDidFail();
  6. }
共有三個方法,分別是用於計算 Rocket 發射時間、計算 Rocket 發射完畢的時間以及發送是否失敗的。


Rocket.java源碼

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

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

ProfessionalWorker.java源碼

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