天天看點

回調函數與函數指針

1.什麼是回調函數

  回調函數就是一個通過函數指針調用的函數。如果你把函數的指針(位址)作為參數傳遞給另一個函數,當這個指針被用為調用它所指向的函數時,我們就說這是回調函數。

2.為什麼要使用回調函數

   因為使用回調函數可以把調用者和被調用者分開,調用者不關心誰是被調用者,所有它需知道的,隻是存在一個具有某種特定原型、某些限制條件(如傳回值為int)的被調用函數。回調函數就好像是一個中斷處理函數,系統在符合你設定的條件時自動調用。

3.應用

輸出結果:

回調函數與函數指針

4.為什麼要有回調函數

    我們對回調函數的使用無非是對函數指針的應用,函數指針的概念本身很簡單,但是把函數指針應用于回調函數就展現了一種解決問題的政策,一種設計系統的思想。

在解釋這種思想前我想先說明一下,回調函數固然能解決一部分系統架構問題但是絕不能再系統内到處都是,如果你發現你的系統内到處都是回調函數,那麼你一定要重構你的系統。回調函數本身是一種破壞系統結構的設計思路,回調函數會絕對的變化系統的運作軌迹,執行順序,調用順序。回調函數的出現會讓讀到你的代碼的人非常的懵頭轉向。

那麼什麼是回調函數呢,那是不得以而為之的設計政策,想象一種系統實作:在一個下載下傳系統中有一個檔案下載下傳子產品和一個下載下傳檔案目前進度顯示子產品,系統要求實時的顯示檔案的下載下傳進度,想想很簡單在面向對象的世界裡無非是實作兩個類而已。但是問題恰恰出在這裡,顯示子產品如何驅動下載下傳進度條?顯示子產品不知道也不應該知道下載下傳子產品所知道的檔案下載下傳進度(面向對象設計的封裝性,子產品間要解耦,子產品内要内聚),檔案下載下傳進度是隻有下載下傳子產品才知道的事情,解決方案很簡單給下載下傳子產品傳遞一個函數指針作為回調函數驅動顯示子產品的顯示進度。

在面向對象的世界中這樣的例子還真不少,造成這樣的問題的根源,相信大家已經從上面的叙述中體會到了,就是面向對象的程式設計思想,就是設計模式中要求的子產品獨立性,高内聚低耦合等特性。

封裝變化的程式設計政策給程式設計人員第一位的指導思想就是面向接口程式設計,即設計模式中提到的面向虛拟程式設計而不是面向實作。這樣的程式設計思想極大地革新了程式設計世界,可以說沒有這一原則就沒有面向對象的程式設計,這一原則給程式設計一種指導思想即如何更高的将現實模型映射成程式模型。這樣的設計思想在極大地催生高度獨立性子產品的同時削弱了子產品間的協作性,也就是耦合性,它使得子產品間更多的從事着單向的調用工作,一個子產品需要某種服務就去找另一個子產品,這使得程式呈現出層次性,高層通過接口調用底層,底層提供服務。但是現實世界中嚴格遵循現層次特性的系統是很少見的,絕對的mvc是不存在的,因為更多的子產品要求通并協作,可見沒有耦合就沒有協作沒有好的調用關系,耦合真的不是錯。

既然我們需要子產品間的協作,同時我們又厭惡的摒棄子產品間你中有我我中有你的暧昧關系那如何生成系統呢,答案是函數指針(不一定一定是函數指針)也就是使用回調的方式。如果一個對象關心另一個對象的狀态變化那麼給狀态的變化注冊回調函數讓它通知你這類狀态的改變,這樣在封裝了子產品變化的同時實作了子產品間的協作關系另辟獨徑的給對象解耦。

用代碼解釋:http://blog.csdn.net/stpeace/article/details/12178097

繼續閱讀