發(fā)布時(shí)間:2025-05-11 16:10:50
回調(diào)函數(shù)、面向?qū)ο笾械氖录瘮?shù),軟硬件層的中斷,DLL的掛鉤,委托,windows的消息循環(huán),都具有相似的功能,這類函數(shù)或者說調(diào)用方式的特點(diǎn),用句普通話來說就是:回頭再調(diào)用。
被調(diào)方屬于客戶程序,其作用是處理一些特定操作,而客戶程序?qū)τ趫?zhí)行順序不做規(guī)定或者說事先無法確定,亦或者為了效率不作循環(huán)等待,因此將被調(diào)函數(shù)的地址(回調(diào)函數(shù)的指針)告訴調(diào)用方,以便調(diào)用方適當(dāng)時(shí)候調(diào)用執(zhí)行;調(diào)用方服務(wù)于客戶程序(下面稱服務(wù)方),其但本身不負(fù)責(zé)具體數(shù)據(jù)操作,也不關(guān)心被調(diào)方如何處理數(shù)據(jù),它只負(fù)責(zé)在其本身的過程中監(jiān)控某種條件,一旦條件滿足便把數(shù)據(jù)通過地址(回調(diào)函數(shù)指針)發(fā)給被調(diào)者并通知其執(zhí)行。
編寫程序時(shí)可以將兩者的邏輯分開考慮,不需要有嚴(yán)格的相關(guān)性,但是必須有相同的調(diào)用約定(接口一致,邏輯開放),這種調(diào)用方式可以實(shí)現(xiàn)調(diào)用時(shí)的多態(tài)。多態(tài)的好處或者說應(yīng)用場(chǎng)景一般是針對(duì)一些操作,事先無法確定時(shí)機(jī)、順序以及操作方式,而是需要在處理過程中確定或者遇到滿足特定條件發(fā)生時(shí)再確定如何操作。所以,在程序運(yùn)行期間,客戶程序可以隨時(shí)根據(jù)需要切換地址,傳遞不同的回調(diào)函數(shù)地址,這樣服務(wù)方可以不用改變?nèi)魏尾僮髁鞒蹋o需重寫代碼),就可以簡(jiǎn)單地切換不同的核心功能,實(shí)現(xiàn)多態(tài)。
舉個(gè)生活中例子:你家在裝修,委托施工隊(duì)在家施工,特地請(qǐng)假在家監(jiān)督(隨時(shí)處理施工隊(duì)遇到的問題和材料采購請(qǐng)求),但是忽然你老板讓你去一次公司處理一件重要的事情,因此你告知施工負(fù)責(zé)人讓他有問題時(shí)打你手機(jī)(調(diào)用服務(wù)并傳遞回調(diào)函數(shù)指針-你的手機(jī)號(hào),C#中的委托就是這個(gè)概念),然后你就不用守候在家里了。后來施工隊(duì)發(fā)現(xiàn)膠水用完了,因此按照約定,負(fù)責(zé)人打電話(事先傳遞的回調(diào)函數(shù)指針)給你把情況(數(shù)據(jù))告訴你,并詢問買什么牌子的。你接到電話確定了品牌(回調(diào)函數(shù)被執(zhí)行),然后反饋給負(fù)責(zé)人(代碼中則是通過服務(wù)方的方法下達(dá)指令,也可以直接通過回調(diào)函數(shù)返回),此例中回調(diào)函數(shù)就是你本身,回調(diào)函數(shù)指針就是你的手機(jī)號(hào)。
實(shí)際運(yùn)用的簡(jiǎn)單例子:對(duì)一個(gè)int型的一維數(shù)組進(jìn)行循環(huán)時(shí)需要有不同的操作,比如有時(shí)需要取最大值,有時(shí)需要取最小值,當(dāng)然你完全可以寫兩個(gè)循環(huán)函數(shù),主程序需要做什么就調(diào)用什么。但是用回調(diào)函數(shù)就只需要寫一個(gè)循環(huán),循環(huán)函數(shù)就是服務(wù)方,循環(huán)體的核心只負(fù)責(zé)在取到前后兩個(gè)相鄰值后調(diào)用回調(diào)函數(shù),而主程序在調(diào)用循環(huán)前傳遞了回調(diào)函數(shù)指針,當(dāng)需要取最大值時(shí)或最小值時(shí),將對(duì)應(yīng)的函數(shù)指針傳遞給循環(huán)函數(shù)。
多個(gè)相似的處理流程,服務(wù)方只負(fù)責(zé)統(tǒng)一的邏輯,比如循環(huán)邏輯,不同的處理事務(wù)由客戶方提供,需要怎么處理就傳遞對(duì)應(yīng)的函數(shù)地址,這就是回調(diào)函數(shù)靈活的優(yōu)勢(shì),當(dāng)然,客戶程序必須事先準(zhǔn)備好(編寫)各種回調(diào)函數(shù)。
上面所說的優(yōu)點(diǎn)屬于運(yùn)行時(shí)多態(tài),而我認(rèn)為這類委托模式最大優(yōu)點(diǎn)是可以做到用戶交互層面的多態(tài),根據(jù)用戶不同選擇,實(shí)現(xiàn)不同的功能,使得實(shí)現(xiàn)動(dòng)態(tài)系統(tǒng)成為可能,好處是什么,大型應(yīng)用系統(tǒng)業(yè)務(wù)更改不需要改代碼重新編譯了,或者說改動(dòng)量大大減少,這對(duì)于系統(tǒng)維護(hù)來說是很重要的。