隨筆-200  評論-148  文章-15  trackbacks-0

          回調函數還真有點像您隨身帶的BP機:告訴別人號碼,在它有事情時Call您
          回調用于層間協作,上層將本層函數安裝在下層,這個函數就是回調,而下層在一定條件下觸發回調,例如作為一個驅動,是一個底層,他在收到一個數據時,除了完成本層的處理工作外,還將進行回調,將這個數據交給上層應用層來做進一步處理,這在分層的數據通信中很普遍。
          其 實回調和API非常接近,他們的共性都是跨層調用的函數。但區別是API是低層提供給高層的調用,一般這個函數對高層都是已知的;而回調正好相反,他是高 層提供給底層的調用,對于低層他是未知的,必須由高層進行安裝,這個安裝函數其實就是一個低層提供的API,安裝后低層不知道這個回調的名字,但它通過一 個函數指針來保存這個回調,在需要調用時,只需引用這個函數指針和相關的參數指針。
          其實:回調就是該函數寫在高層,低層通過一個函數指針保存這個函數,在某個事件的觸發下,低層通過該函數指針調用高層那個函數。

          關于回調的總結:
          在Java中,通常就是編寫另外一個類或類庫的人規定一個接口,然后你來實現這個接口,然后把這個接口的一個對象作為參數傳給別人的程序,別人的程序必要時就會通過那個接口來調用你編寫的函數。

           

          下面使用java回調函數來實現一個測試函數運行時間的工具類:
          如果我們要測試一個類的方法的執行時間,通常我們會這樣做:
          java 代碼
          public class TestObject {   
              /**  
               * 一個用來被測試的方法,進行了一個比較耗時的循環  
               */   
              public static void testMethod(){   
                  for(int i=0; i<100000000; i++){   
                         
                  }   
              }   
              /**  
               * 一個簡單的測試方法執行時間的方法  
               */   
              public void testTime(){   
                  long begin = System.currentTimeMillis();//測試起始時間   
                  testMethod();//測試方法   
                  long end = System.currentTimeMillis();//測試結束時間   
                  System.out.println("[use time]:" + (end - begin));//打印使用時間   
              }   
                 
              public static void main(String[] args) {   
                  TestObject test=new TestObject();   
                  test.testTime();   
              }   
          }   

          大家看到了testTime()方法,就只有"http://測試方法"是需要改變的,下面我們來做一個函數實現相同功能但更靈活:
          首先定一個回調接口:
          java 代碼
          public interface CallBack {   
              //執行回調操作的方法   
              void execute();   
          }   

          然后再寫一個工具類:
          java 代碼
          public class Tools {   
                 
              /**  
               * 測試函數使用時間,通過定義CallBack接口的execute方法  
               * @param callBack  
               */   
              public void testTime(CallBack callBack) {   
                  long begin = System.currentTimeMillis();//測試起始時間   
                  callBack.execute();///進行回調操作   
                  long end = System.currentTimeMillis();//測試結束時間   
                  System.out.println("[use time]:" + (end - begin));//打印使用時間   
              }   
                 
              public static void main(String[] args) {   
                  Tools tool = new Tools();   
                  tool.testTime(new CallBack(){   
                      //定義execute方法   
                      public void execute(){   
                          //這里可以加放一個或多個要測試運行時間的方法   
                          TestObject.testMethod();
                      }   
                  });   
              }   
                 
          }

           

          通過上面的文字和代碼我們可以理解了什么叫做java的回調。那么我們具體在什么時候使用回調函數呢?

          在進行JDBC編程的時候,我們經常要寫到try catch語句塊,而如果采用回調技術,那么完全可以避免重復的去寫,將自己的方法體使用一個回調接口的方法來實現,每次都傳到同一個try catch當總,但是每一個方法的內容是不相同的。

          再比如算法比較多的情況下,也可以采用這種實現模式來實現。最近看了SWT,發現里面好多的事件驅動都是采用回調來實現的。比如給按鈕添加事件:

                                      Button okButton = createButton(buttons, "&Ok", "Process input",
                                                 new MySelectionAdapter(){
                                                     public void widgetSelected(SelectionEvent e) 
                                                     {
                                                         System.out.println("Name:         " + nameField.getText());
                                                         System.out.println("Address:      " + addrField.getText());
                                                         System.out.println("Phone number: " + phoneField.getText());
                                                     }
                                                 });

          匿名內部類最常用的情況就是在回調當中的精彩表現。

           

          回調是一種雙向調用模式,也就是說,被調用方在接口被調用時也會調用對方的接口.

          posted on 2010-11-03 10:57 無聲 閱讀(343) 評論(0)  編輯  收藏 所屬分類: 職場生活
          主站蜘蛛池模板: 宜阳县| 南江县| 乌拉特中旗| 旬阳县| 大足县| 锡林浩特市| 平昌县| 沁源县| 湖北省| 宜良县| 西青区| 阿鲁科尔沁旗| 潼南县| 花垣县| 旌德县| 嵊泗县| 湖州市| 沛县| 贵南县| 成安县| 博乐市| 梁河县| 平顶山市| 青冈县| 水富县| 舞阳县| 平遥县| 湖北省| 英超| 靖安县| 澄城县| 新沂市| 隆回县| 昌江| 阿尔山市| 长葛市| 双牌县| 贞丰县| 鹤庆县| 临洮县| 广河县|