java中的回調函數——利用接口(轉)

 

    在WINDOWS中,程序員想讓系統DLL調用自己編寫的一個方法,於是利用DLL當中回調函數(CALLBACK)的接口來編寫程序,使它調用,這個就稱爲回調。在調用接口時,需要嚴格的按照定義的參數和方法調用,並且需要處理函數的異步,否則會導致程序的崩潰。這樣的解釋似乎還是比較難懂,這裏舉個簡單的例子,程序員A寫了一段程序(程序a),其中預留有回調函數接口,並封裝好了該程序。程序員B要讓a調用自己的程序b中的一個方法,於是,他通過a中的接口回調自己b中的方法。目的達到。在C/C++中,要用回調函數,被調函數需要告訴調用者自己的指針地址,但在JAVA中沒有指針,怎麼辦?我們可以通過接口(interface)來實現定義回調函數。
     假設我是程序員A,以下是我的程序a:
public class Caller{
    private MyCallInterface mc;
    public Caller(){}

    public setI(MyCallInterface mc){

           this.mc=mc;

    }

    public call(){mc.fuc();}//Caller的調用方法
}


     這裏需要定義一個接口,以便程序員B根據我的定義編寫程序實現接口。
public interface MyCallInterface{
      public void fuc();
}


     於是,程序員B只需要實現這個接口就能達到回調的目的了:
public class callee implements MyCallInterface{
    public void fuc(){
              //do something
    }

}

    下面是調用過程:

public class callbacks{
   public static void main(String args[]){
         Callee c1=new Callee();

         Caller caller=new Caller();

         caller.setI(c1);
         caller.call();
    }
}

在以上代碼中,caller是調用者,callee是被調用者,callbacks表示調用過程。

先產生了Callee對象,利用這個callee對象產生的Caller對象則攜帶了一些信息(即與Callee對象的關聯),所以Caller對象可以利用自己的call方法調用Callee的方法。——這就是整個回調過程。

B產生A,則A具有調用B的方法的能力。caller中具有的接口引用很關鍵。實現了此接口引用的callee只需將自己的引用傳給Caller。

一般來說分爲以下幾步:

  1. 聲明回調函數的統一接口interface A,包含方法fuc();
  2. 在調用類caller內將該接口設置爲私有成員private A XXX;
  3. 在caller內提供一個public方法,可以將外部“該接口A的實現類的引用”通過形參傳給XXX;
  4. caller的某個方法call()中會用到XXX.fuc()方法;
  5. 在caller的實例中,將實現了A接口的對象的引用傳給caller,後調用call()方法;

注意:步驟3中亦可以使用Caller的構造函數直接實現。

 

JAVA排序的compare接口:

  1. interface Compare {   
  2.    boolean lessThan(Object lhs, Object rhs);   
  3.    boolean lessThanOrEqual(Object lhs, Object rhs);   
  4.   }   
  5.   
  6. import java.util.*;   
  7.      
  8.   public class SortVector extends Vector {   
  9.    private Compare compare; // 私有接口成員   
  10.    public SortVector(Compare comp) {   
  11.        compare = comp;   
  12.    }   
  13.    public void sort() {   
  14.        quickSort(0, size() - 1);   
  15.    }   
  16.    private void quickSort(int left, int right) {   
  17.        if(right > left) {   
  18.       Object o1 = elementAt(right);   
  19.       int i = left - 1;   
  20.       int j = right;   
  21.       while(true) {   
  22.            while(compare.lessThan(   
  23.              elementAt(++i), o1))   
  24.                       ;   
  25.            while(j > 0)   
  26.              if(compare.lessThanOrEqual(   
  27.                   elementAt(--j), o1))   
  28.                      break;    
  29.               if(i >= j) break;   
  30.                   swap(i, j);   
  31.        }   
  32.       swap(i , right);   
  33.       quickSort(left, i-1);   
  34.       quickSort(i+1, right);   
  35.        }   
  36.     }   
  37.     private void swap(int loc1, int loc2) {   
  38.        Object tmp = elementAt(loc1);   
  39.        setElementAt(elementAt(loc2), loc1);   
  40.        setElementAt(tmp, loc2);   
  41.    }   
  42.   }   
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章