本文整理自互联网
面向过程语言中的回调函数(C语言)
函数是用来被调用的,我们调用函数的方法有两种:
直接调用:在函数A的函数体里通过书写函数B的函数名来调用之,使内存中对应函数B的代码得以执行。这里,A称为“主叫函数”(Caller),B称为“被叫函数”(Callee)。
间接调用:在函数A的函数体里并不出现函数B的函数名,而是使用指向函数B的函数指针p来使内存中属于函数B的代码片断得以执行——听起来很酷,是吧。
比起直接调用来,间接调用的确麻烦,那为什么还要使用间接调用呢?原因很简单——直接调用把函数名都写进函数体了,经过编译器那么一编译,板上钉钉,A注定调用的是B了,这样的程序只能按照程序员事先设计好的流程执行下去,太呆板了。此时,间接调用的巨大灵活性就显现出来了。想一想,如果p是函数A的一个参数(参数是变量,是变量就可以变吗!),那么程序的最终用户完全可以通过操作来改变p的指向——这样,A在通过p调用函数的时候就有机会调用到不同的函数,这样程序的实用性和扩展性就强多了。
这就像是面向对象语言中的多态的概念。
面向对象语言中的回调函数(java)
在java中通过接口实现函数的回调,或者说设计接口的意义就是实现函数的回调(个人意见)。按钮的点击监听就是一个典型的例子:你可以实现很多按钮,按后给这些按钮添加事件响应的代码,在系统监听到按钮被按下的时候就会回调你在监听器接口中实现的函数。
比如这个例子模仿了监听按钮的代码:
package btn_click; /** * 按钮类 * @author Cer * */ public class Btn { /** * 一个监听器 */ private BtnListener bl; /** * 注册监听器 * @param bl */ public void addClickListener(BtnListener bl){ this.bl = bl; } /** * 模拟btn被点击 */ public void click(){ bl.onClick(); } }
package btn_click; /** * * 按钮的监听器 * @author Cer * */ public interface BtnListener { /** * 声明服务 */ public void onClick(); }
package btn_click; /** * 客户端代码 * @author Cer * */ public class Client { public static void main(String[] args) { Btn plus_btn= new Btn(); //给btn注册监听器 //onclick就是客户自己实现的回调函数 plus_btn.addClickListener(new BtnListener() { @Override public void onClick() { System.out.println("这里实现加法....."); } }); Btn sub_btn = new Btn(); sub_btn.addClickListener(new BtnListener() { @Override public void onClick() { System.out.println("这里实现减法....."); } }); //这里是模仿按钮被点击 sub_btn.click(); plus_btn.click(); } }
回调函数的意义
回调用于层间协作,上层将本层函数安装在下层,这个函数就是回调,而下层在一定条件下触发回调,例如作为一个驱动,是一个底层,他在收到一个数据时,除了完成本层的处理工作外,还将进行回调,将这个数据交给上层应用层来做进一步处理,这在分层的数据通信中很普遍。
其实回调和API非常接近,他们的共性都是跨层调用的函数。但区别是API是低层提供给高层的调用,一般这个函数对高层都是已知的;而回调正好相反,他是高层提供给底层的调用,对于低层他是未知的,必须由高层进行安装,这个安装函数其实就是一个低层提供的API,安装后低层不知道这个回调的名字,但它通过一个函数指针来保存这个回调,在需要调用时,只需引用这个函数指针和相关的参数指针。
其实:回调就是该函数写在高层,低层通过一个函数指针保存这个函数,在某个事件的触发下,低层通过该函数指针调用高层那个函数。
参考:
http://blog.csdn.net/sweetwxh/article/details/2067139
http://liutiemeng.blog.51cto.com/120361/18874
http://kidult.iteye.com/blog/148982
http://blog.csdn.net/sicluoyi/article/details/1737969/