統計

          留言簿(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 閱讀(367) 評論(0)  編輯  收藏 所屬分類: Programing

          主站蜘蛛池模板: 和田县| 永善县| 吉林市| 边坝县| 临洮县| 宝兴县| 长沙县| 探索| 秦安县| 时尚| 蕲春县| 景东| 西盟| 海林市| 正阳县| 沿河| 仪陇县| 随州市| 景洪市| 叶城县| 东至县| 安阳市| 莱西市| 泗洪县| 通州区| 石景山区| 阳曲县| 周至县| 棋牌| 永川市| 东明县| 桐庐县| 宜君县| 桓台县| 高陵县| 绥滨县| 商南县| 汾阳市| 郓城县| 十堰市| 万州区|