统计

留言簿(1)

DB

Others

QA

Tech Website

阅读排行榜

评论排行榜

回调机制

一、基本概念
软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用、回调和异步调用。
同步调用是一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用,如HTTP;
回调是一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口;
异步调用是一种类似消息或事件的机制,不过它的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方(即调用客户方的接口),如JMS;
回调和异步调用的关系非常紧密,通常我们使用回调来实现异步消息的注册,通过异步调用来实现消息的通知。同步调用是三者当中最简单的,而回调又常常是异步调用的基础。



二、基本实现
在C语言中,如果参数是一个函数指针,调用者可以传递一个函数的地址给实现者,让实现者去调用它,这称为回调函数。

#include <stdio.h>
#include 
<stdlib.h>

typedef 
void (*callback_t) (void *);
void repeat_three_times(callback_t, void *);
void say_hello(void *str);
void count_numbers(void * num);
main()
{
      repeat_three_times(say_hello,
"guys");
      repeat_three_times(count_numbers, (
void*4);
      system(
"pause");
}


void repeat_three_times(callback_t f, void *para){
     f(para);
     f(para);
     f(para);
     }

void say_hello(void *str){
     printf(
"hello %s\n", (const char*)str);
     }

void count_numbers(void * num){
     
int i ;
     
for(i = 1; i <= (int)num; i++)
           printf(
"%d ", i);
     putchar(
'\n');
     }


在面向对象的语言中(以Java为例),主要利用多态来实现回调,其原理和观察者模式相似,被调函数首先要在调用者身上注册,当某一事件触发时,回调函数被触发;有个很形象的说法:我去找你解决一个问题,但你目前也不知道如何解决,要研究一会,我就把我的联系方式告诉你,你解决问题后主动告诉我吧。这就是一个异步的回调,我省去了一直等待这个过程,我可以利用这些时间去处理别的事情。

一个详细的代码例子:
2011年4月29日
package callback;

public interface ICallback {
    
public void execute();
}



package callback;

public class CallWithCallback implements ICallback{

    
public CallWithCallback(){}
    
    
public void execute() {
        System.out.println(
"execute callback function..");
    }


}


package callback;

public class Caller {
    
    
private ICallback callback;
    
public void setCallback(ICallback callback) {
        
this.callback = callback;
    }

    
    
public Caller(){}
    
    
public void doCallback(){
        
this.callback.execute();
    }

    
}


package callback;

public class CallerDriveMain {

    
public static void main(String[] args) {
        Caller caller 
= new Caller();
        caller.setCallback(
new CallWithCallback());  //注册
        caller.doCallback();  //调用

    }


}


三、参考资料
1)异步消息的传递-回调机制
2)C语言回调函数

posted on 2011-04-29 22:36 XXXXXX 阅读(352) 评论(0)  编辑  收藏 所属分类: Programing


只有注册用户登录后才能发表评论。


网站导航: