回調函數

 

1.  什麼是回調函數 
    回調函數(callback Function),顧名思義,用於回調的函數。  回調函數只是一個功能片段,由用戶按照回調函數調用約定來實現的一個函數。回調函數是一個工作流的一部分,由工作流來決定函數的調用(回調)時機。回調函數包含下面幾個特性: 
    1、屬於工作流的一個部分; 
    2、必須按照工作流指定的調用約定來申明(定義); 
    3、他的調用時機由工作流決定,回調函數的實現者不能直接調用回調函數來實現工作流的功能;     

2. 回調機制 
    回調機制是一種常見的設計模型,他把工作流內的某個功能,按照約定的接口暴露給外部使用者,爲外部使用者提供數據,或要求外部使用者提供數據。

=======================================================

java回調機制:

軟件模塊之間總是存在着一定的接口,從調用方式上,可以把他們分爲三類:同步調用、回調和異步調用。

 

同步調用:一種阻塞式調用,調用方要等待對方執行完畢才返回,它是一種單向調用;

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

異步調用:一種類似消息或事件的機制,不過它的調用方向剛好相反,接口的服務在收到某種訊息或發生某種事件時,會主動通知客戶方(即調用客戶方的接口)。

回調和異步調用的關係非常緊密:使用回調來實現異步消息的註冊,通過異步調用來實現消息的通知。

========================================================

 

用Java裏的例子:

 

Java代碼  收藏代碼
  1. package callbackexample;  
  2.   
  3. public interface ICallBack {  
  4.     //需要回調的方法  
  5.     public void postExec();  
  6. }  

 

另外的一個類:

Java代碼  收藏代碼
  1. package callbackexample;  
  2.   
  3. /** 
  4.  * FooBar並沒有實現接口,但通過“組合聚合原則”,取得了 一個接口對象,而此對象是其他類調用FooBar的setCallBack方法 
  5.  * 時候傳給FooBar的。因此可以在業務需要的地方來調用實現接口的 類裏面的方法 
  6.  */  
  7. public class FooBar {  
  8.     //組合聚合原則  
  9.     private ICallBack callBack;  
  10.   
  11.     public void setCallBack(ICallBack callBack) {  
  12.         this.callBack = callBack;   doSth();  
  13.     }  
  14.   
  15.     /**業務需要的時候,通過委派,來調用實現類的具體方法 */  
  16.     public void doSth() {  
  17.         callBack.postExec();  
  18.     }  
  19. }  

 

 

第二個類在測試類裏面,是一個匿名類:

Java代碼  收藏代碼
  1. package callbackexample;  
  2. /** 
  3. * new ICallBack給foo對象傳遞了一個實現ICallBack接口的匿名類,  
  4. * 這樣FooBar類的對象就取得了一個實現接口的類, 
  5. * 可以在任何時候調用接口中的方法 
  6. */  
  7.   
  8. public class Test {  
  9.     public static void main(String[] args) {  
  10.         FooBar foo = new FooBar();  
  11.         foo.setCallBack(new ICallBack() {  
  12.             public void postExec() {  
  13.                 System.out.println("在Test類中實現但不能被Test的對象引用,而由FooBar對象調用");  
  14.             }  
  15.         });  
  16.     }  
  17. }  

上訴的代碼:

  1.兩個類:匿名類和FooBar

  2.匿名類實現接口ICallBack(在test測試的main方法中用匿名類的形式實現)

  3.FooBar 擁有一個參數爲ICallBack接口類型的函數setCallBack(ICallBack   o)  

  4.匿名類運行時調用FooBar中setCallBack函數,以自身傳入參數  

  5.FooBar已取得匿名類,就可以隨時回調匿名類中所實現的ICallBack接口中的方法

 ==================================

1。首先回調方法的概念與“構造方法”的概念是不一樣的,它不是指java中某個具有特殊意義或用途的方法。 
2。稱它爲方法的“回調”更恰當一些,它是指方法的一種調用方式。任何一個被“回調”的方法,皆可稱之爲“回調方法” 
3。方法的回調通常發生在“java接口”和“抽象類”的使用過程中。 
假設有接口名爲 ICallBack 其中有方法名爲postExec()
有類Myclass 實現了該接口,也就是一定實現了postExec()這個方法。現在有另一個類FooBar它有個方法 setCallBack(ICallBack callBack) ,並且setCallBack方法調用了callBack的postExec()方法。
如果現在,我們使用一個Myclass 的實例myClass,將它作爲參數帶入到setCallBack(ICallBack callBack)方法中,我們就說setCallBack(ICallBack callBack)方法回調了myClass的postExec()方法。 

 

 
 

ava中沒有指針,不能傳遞方法的地址,一般採用接口回調實現把實現某一接口的類創建的對象的引用賦給該接口聲明的接口變量,那麼該接口變量就可以調用被類實現的接口的方法。

 

實現回調的原理簡介如下

首先創建一個回調對象,然後再創建一個控制器對象,將回調對象需要被調用的方法告訴控制器對象。控制器對象負責檢查某個場景是否出現或某個條件是否滿足。當此場景出現或此條件滿足時,自動調用回調對象的方法

可以舉個現實生活中的例子:

一讀者想借《軟件技術學習與實踐》這本書,但這本書已被其他讀者借走了。於是,讀者與圖書館管理員間發生了以下對話:

讀者:“我把我的電話號碼告訴你,等書一到就馬上通知我。”

管理員:“好的。另一讀者把書還回來後,馬上給您打電話,書我先幫您留着。”

在上述這個場景中,讀者就是“回調對象”,管理員就是“控制器對象”,讀者的電話號碼就是“回調對象的方法”

詳細的實例如下:

1、創建一個回調接口:

1 //回調接口
2  public interface ICallBack
3 
4 void run();
5 }
 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章