1. 程式人生 > >利用介面與類實現類似於函式指標的功能

利用介面與類實現類似於函式指標的功能

在 C語言中,有一個非常重要的概念——函式指標,其最重要的功能是實現回撥函式。

所謂回撥函式,就是指函式先在某處註冊,而它將在稍後某個需要的時候被呼叫。在Windows系統中,開發人員想讓系統動態連結( Dynamic Link Library, DDL )呼叫自己編寫的一個方法,於是利用 DDL 當中的回撥函式的藉口來編寫程式,通過傳遞一個函式的指標來被呼叫,這個過程就稱為回撥。

回撥函式一般用於

        接獲訊息、獲取系統資訊或處理非同步事件。

函式指標一般作為函式的引數來使用,開發人員在使用時可以根據自己的需求來傳遞自定義的函式來實現指定的功能。 例如,在實現排序演算法時,可以通過傳遞一個函式指標來決定兩個數的先後順序,從而最終決定該演算法是按升序排序還是降序排序。

在 java 語言中沒有指標的概念,那麼如何才能在 java 語言中實現類似於函式指標的功能呢?
可以利用介面與類來實現同樣的效果。具體而言,先定義一個介面,然後在介面中宣告呼叫的方法,接著實現這個介面,最後把這個實現類的一個物件作為引數傳遞給呼叫程式,呼叫程式通過這個引數來呼叫指定的函式,從而實現毀掉函式的功能。示例如下:

 // 介面中定義了一個用來比較大小的方法
 interface IntCompare {
    public int cmp(int a, int b);
}

class Cmp1 implements IntCompare { // 升序排序
    public
int cmp(int a, int b) { if(a > b) return 1; else if(a < b) return -1; else return 0; } } class Cmp2 implements IntCompare { // 降序排序 public int cmp(int a, int b) { if(a > b) return -1; else if(a < b) return
1; else return 0; } } public class FuncPointer { public static void insertSort (int[] a, IntCompare cmp) { if(a != null) { for(int i = 1; i< a.length; i++) { int temp = a[i], j = i; if(cmp.cmp(a[j-1], temp) == 1) { while(j>=1 && cmp.cmp(a[j-1], temp) == 1) { a[j] = a[j-1]; j--; } } a[j] = temp; } } } public static void main(String[] args) { int[] arr1 = {7, 3, 19, 40, 4, 7, 1}; insertSort(arr1, new Cmp1()); System.out.print("升序排序:"); for(int i = 0; i < arr1.length; i++) { System.out.print(arr1[i] + " "); } System.out.println(); int[] arr2 = {7, 3, 19, 40, 4, 7, 1}; insertSort(arr2, new Cmp2()); System.out.print("降序排序:"); for(int i = 0; i < arr2.length; i++) { System.out.print(arr2[i] + " "); } System.out.println(); } }/* Output: 升序排序:1 3 4 7 7 19 40 降序排序:40 19 7 7 4 3 1 *///~

上例定義了一個比較大小的介面 IntCompare, 這個介面實際上充當了C語言中函式指標的功能,在使用時,開發人員可以根據實際需求傳入自定義的類。在上例中分別有兩個類 Cmp1 和 Cmp2 都實現了這個介面,分別用來在實現升序排序和降序排序時使用。其實這也是策略設計模式所用到的思想。