变成一种自然而然的处理例程,使编程者顿觉气顺。再者,地址是一个危险的东西,用好
了可使程序加速,用不好处处是陷阱,程序随时都会崩溃。现代编程方式总是想法把地址
隐藏起来(隐藏比较彻底的如 VB 和 Java),其代价是降低了程序效率。事件例程(?)
使编程者无需直接操作地址,但并不会使程序减速。
(例程似乎是进程的台湾翻译。)
三,精妙比喻:
回调函数还真有点像您随身带的 BP 机:告诉别人号码,在它有事情时 Call 您。
回调用于层间协作,上层将本层函数安装在下层,这个函数就是回调,而下层在一定
条件下触发回调,例如作为一个驱动,是一个底层,他在收到一个数据时,除了完成本层
的处理工作外,还将进行回调,将这个数据交给上层应用层来做进一步处理,这在分层的
数据通信中很普遍。其实回调和 API 非常接近,他们的共性都是跨层调用的函数。但区别
是 API 是低层提供给高层的调用,一般这个函数对高层都是已知的;而回调正好相反,他
是高层提供给底层的调用,对于低层他是未知的,必须由高层进行安装,这个安装函数其
实就是一个低层提供的 API,安装后低层不知道这个回调的名字,但它通过一个函数指针
来保存这个回调,在需要调用时,只需引用这个函数指针和相关的参数指针。 其实:回
调就是该函数写在高层,低层通过一个函数指针保存这个函数,在某个事件的触发下,低
层通过该函数指针调用高层那个函数。
四 无题
软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用 、
回调和异步调用。同步调用是一种阻塞式调用,调用方要等待对方执行完毕才返回,它是
一种单向调用;回调是一种双向调用模式,也就是说,被调用方在接口被调用时也会调用
对方的接口;异步调用是一种类似消息或事件的机制,不过它的调用方向刚好相反,接口
的服务在收到某种讯息或发生某种事件时,会主动通知客户方(即调用客户方的接口)。
回调和异步调用的关系非常紧密,通常我们使用回调来实现异步消息的注册,通过异步调
用来实现消息的通知。同步调用是三者当中最简单的,而回调又常常是异步调用的基础。
对于不同类型的语言(如结构化语言和对象语言)、平台( Win32、JDK)或构架
(CORBA、DCOM、WebService),客户和服务的交互除了同步方式以外,都需要具备一
定的异步通知机制,让服务方(或接口提供方)在某些情况下能够主动通知客户,而回调
是实现异步的一个最简捷的途径。
对于一般的结构化语言,可以通过回调函数来实现回调。回调函数也是一个函数或过程 ,
不过它是一个由调用方自己实现,供被调用方使用的特殊函数。
在面向对象的语言中,回调则是通过接口或抽象类来实现的,我们把实现这种接口的类
成为回调类,回调类的对象成为回调对象。对于象 C++或 Object Pascal 这些兼容了过程特
性的对象语言,不仅提供了回调对象、回调方法等特性,也能兼容过程语言的回调函数机
制。