隨筆-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)  編輯  收藏 所屬分類: 職場生活
          主站蜘蛛池模板: 呼图壁县| 定兴县| 华蓥市| 西乡县| 岫岩| 淮阳县| 乌鲁木齐市| 邻水| 黎平县| 台南县| 女性| 河北区| 大兴区| 民乐县| 布尔津县| 澜沧| 香格里拉县| 南汇区| 正定县| 玉门市| 永善县| 乐清市| 铜川市| 吉安县| 韩城市| 丹阳市| 武功县| 明溪县| 马龙县| 凉城县| 天门市| 宝坻区| 汕尾市| 紫阳县| 青冈县| 台前县| 揭西县| 绥阳县| 攀枝花市| 江油市| 湄潭县|