利用接口与类实现类似于函数指针的功能

在 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 都实现了这个接口,分别用来在实现升序排序和降序排序时使用。其实这也是策略设计模式所用到的思想。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值