感觉回调函数就是通过函数指针调用函数.为什么要用回

如题所述

回调函数、面向对象中的事件函数,软硬件层的中断,DLL的挂钩,委托,windows的消息循环,都具有相似的功能,这类函数或者说调用方式的特点,用句普通话来说就是:回头再调用。
被调方属于客户程序,其作用是处理一些特定操作,而客户程序对于执行顺序不做规定或者说事先无法确定,亦或者为了效率不作循环等待,因此将被调函数的地址(回调函数的指针)告诉调用方,以便调用方适当时候调用执行;调用方服务于客户程序(下面称服务方),其但本身不负责具体数据操作,也不关心被调方如何处理数据,它只负责在其本身的过程中监控某种条件,一旦条件满足便把数据通过地址(回调函数指针)发给被调者并通知其执行。
编写程序时可以将两者的逻辑分开考虑,不需要有严格的相关性,但是必须有相同的调用约定(接口一致,逻辑开放),这种调用方式可以实现调用时的多态。多态的好处或者说应用场景一般是针对一些操作,事先无法确定时机、顺序以及操作方式,而是需要在处理过程中确定或者遇到满足特定条件发生时再确定如何操作。所以,在程序运行期间,客户程序可以随时根据需要切换地址,传递不同的回调函数地址,这样服务方可以不用改变任何操作流程(无需重写代码),就可以简单地切换不同的核心功能,实现多态。
举个生活中例子:你家在装修,委托施工队在家施工,特地请假在家监督(随时处理施工队遇到的问题和材料采购请求),但是忽然你老板让你去一次公司处理一件重要的事情,因此你告知施工负责人让他有问题时打你手机(调用服务并传递回调函数指针-你的手机号,C#中的委托就是这个概念),然后你就不用守候在家里了。后来施工队发现胶水用完了,因此按照约定,负责人打电话(事先传递的回调函数指针)给你把情况(数据)告诉你,并询问买什么牌子的。你接到电话确定了品牌(回调函数被执行),然后反馈给负责人(代码中则是通过服务方的方法下达指令,也可以直接通过回调函数返回),此例中回调函数就是你本身,回调函数指针就是你的手机号。
实际运用的简单例子:对一个int型的一维数组进行循环时需要有不同的操作,比如有时需要取最大值,有时需要取最小值,当然你完全可以写两个循环函数,主程序需要做什么就调用什么。但是用回调函数就只需要写一个循环,循环函数就是服务方,循环体的核心只负责在取到前后两个相邻值后调用回调函数,而主程序在调用循环前传递了回调函数指针,当需要取最大值时或最小值时,将对应的函数指针传递给循环函数。
多个相似的处理流程,服务方只负责统一的逻辑,比如循环逻辑,不同的处理事务由客户方提供,需要怎么处理就传递对应的函数地址,这就是回调函数灵活的优势,当然,客户程序必须事先准备好(编写)各种回调函数。
上面所说的优点属于运行时多态,而我认为这类委托模式最大优点是可以做到用户交互层面的多态,根据用户不同选择,实现不同的功能,使得实现动态系统成为可能,好处是什么,大型应用系统业务更改不需要改代码重新编译了,或者说改动量大大减少,这对于系统维护来说是很重要的。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2017-04-26
裙叱咤风云椭蓉操心苹
相似回答