編程中的回調
軟件模塊之間總是存在一些接口,從調用方式上分三種:
1. 同步調用:
阻塞式調用,要等對方調用完畢後再調用;
2.異步調用:
類似於消息或事件,接口在接收到某種消息或發生某種事件時主動去通知調用方;
3.雙向調用:
被調用接口在被調用時也會調用對方的接口;
雙向調用機制就是回調機制。其實現方式分兩種:
1.結構化編程:
通過回調函數實現。回調函數由調用方自己實現,供調用方使用;
2.面向對象的編程:
通過接口或者抽象類,用虛函數實現。即類A調用類B,類B又調用類A的某個方法;
本文主要講回調函數的實現:
1.回調函數:
就是通過函數指針調用的函數。回調函數由自己實現,回調函數的指針作爲參數傳給另一個函數,當這個指針被用來調用函數時,就可以通過我們自己實現的回調函數實現一些功能。
回調函數不是由函數實現方直接調用的,而是在特定的時候由另一方調用的。
2.實現機制
1) :先定義一個函數
2) :自己實現這個函數(即回調函數),並且將此函數指針做爲參數傳遞給調用者。
3) :當滿足特定條件時,調用方通過函數指針調用回調函數對事件進行處理。
3.回調函數示例
Node* Search (Node* node ,int (*compare)(void const * ,void const *),void const* value ) { while (node != NULL) { if (compare ( node->value ,value ) == 1) { return node; } else { node = node->next; } } }
此處,compare函數就是回調函數,我們可以在回調函數中實現 int 、 float 、string 的比較,而當Search需要時可以傳入其中一個的地址,與給定的value進行比較。