回调函数的触发方式和主要的意义?

一般在回调函数都是怎么被触发运行的呢?为什么要使用呢,有时候我觉得发个消息用消息处理不也可以达到效果吗?

mfc

8个回答

最近刚好一直用回调,就简单说一下我这边用回调的用途。平时我们封装一个函数返回一个结果,这个很容易做。例如int GetValue();
但是有很多时候我们需要返回一组结果,例如用户输入了查询条件,我们封装的函数返回的是一个结果集,那这个结果集又该怎么返回呢?你可能会想到用一个vector,但这个vector你定义了,用户也要拿这个来收数据,其实很不方便。
那么如果用回调来解决就简单多了,定义一个回调函数,将结果集交给这个回调函数来处理,用户在外面通过回调函数拿到数据想干什么就干什么了,是用数组还是vector或是map来管理数据都不是你考虑的事情,因为你只负责返回结果。
所以我只要遇到返回结果集这种用法,统一使用回调函数来处理。
我的回答可能不是你想要的,但算是实际应用的一个例子,希望对你有所帮助。

这个问题问的好!
问题:有 模块A和模块B ,如果模块A依赖模块B,在A中调用B
A.cpp
#include "B.h"

...

依赖是单方向的,如果B又要通知A,B就对A产生了依赖

这个时候我们就想
#include "A.h"
...

现在A依赖B,B又依赖A,产生了双向依赖,这样会导致程序复杂,有的时候导致冲突。

现在我们要解耦,依赖只是单方向的,实现方式是A依赖B ,B依赖一个函数指针,这个指针可以来自任何地方。

这样B对A的调用就变为隐式调用,B对A不依赖,只是依赖一个函数接口,我们把这个接口叫做回调。

一句话解释:回调是程序中的一种抽象,我们不要依赖实现,我们依赖接口。同时也是一种解耦的方式。

回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

比如说你一个方法需要打开另外一个页面进行操作,操作完这个页面才会有反应(比如弹出选择页) 那么是不是执行一个函数打开弹出选择页 弹出选择页选择之后,页面关闭在原始页面执行函数。这个逻辑才对,原始页面执行的就是设置的回调函数。

回调函数是给窗口调用的函数,不是给用户调用的。用户只要给窗口发送指令,让它去调用就行了。GetMessage函数从消息队列中获取消息,dispatchMessage函数的作用就是将消息发送到窗口,窗口就会调用回调函数去处理消息,具体怎么处理,就看你回调函数怎么写了。那么问题来了,如果不使用回调函数是否可以处理消息??
答案是肯定的。你可以用GetMessage函数获取消息,然后不将消息发送给窗口,自己写了一个非回调函数把消息给处理了,这是可以的。但是,真的不推荐这么做,麻烦,而且还冷不丁地冒出一些错误,自己也不知怎么处理。

Android中回调函数在普通的使用中和发送消息是没有区别的,但是在封装工具类的时候就有差别了,当你封装了某个工具类刚开始是满足使用的,而且是测试过的,是ok的。但是后来这个工具类已经不能满足你的需求了,一般的做法是直接修改这个工具类,这个做法也能满足想要的效果,但是修改已经封装好的类必定是有风险的,尽量不要改动,遵循设计模式中的开闭原则,那么我们想要做到不修改已经封装好的,但是灵活性又好,但不满足需求时能够扩展,这个时候就需要接口回调了

回调函数是一种一对一的方式,通过回调函数间接调用内部的实现逻辑,并且重写方法的目的性强,例如点击回调就叫onClick,实现成本比较低,并且可以降低调用者和被调用者之间的耦合性,也有利于代码的理解和维护。
主要特征:目的性明确,逻辑统一,对于重写方法的实现有规范。

消息通知是一种一对多的方式,通过消息通知所有绑定了的对象做处理,但是处理的目的多样化,例如得到用户信息,有的是更新界面,有的是写入本地缓存,有的是重新发起网络请求等等,但是这里面一般也会使用回调函数来进行解耦,实现成本相对比较高,代码也相对比较分散,代码的理解和维护相对要难一些。
主要特征:目的性多样,不关心具体的处理,仅仅是起到通知的作用。

虽然都能实现同样的效果,但是怎么使用,还是看你自己考虑把。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐