分享帖:关于回调

风之子赛拉飞尔 风之子赛拉飞尔 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
今天用到回调,也看了些网上的文章,这里分享一下个人的心得体会

回调,字面意思是返回的调用,是相对于“调用”而言的。A调用B,B的执行过程中又反过来调用A,这就是回调。
以下约定,其中A称为客户端,B称为服务端,以便于描述。

回调是一种设计思想,“回调就是对函数指针的一种运用方式”这只能说是语法层面的理解,
还没有达到设计层面的高度。设计模式中,访问者模式(Visitor Pattern)中的两个要素之间就存在回调关系。
也就是说通过服务端B封装一些逻辑过程,但其中某个环节又需要暴露给客户端A,以提供自由度。

回调的范式1:

{
typedef int (__stdcall *CallbackFunc)(LPARAM P1, LPARAM P2, LPARAM P3);
int ServerFunc(LPARAM P1, CallbackFunc fn, LPARAM P3);
}

ServerFunc是主调函数,是服务端B提供给客户端A的接口,由客户端A提出规格要求。
CallbackFunc是回调函数,是客户端A提供给服务端B的回调接口,由服务端B提出规格要求。
P1是A传给B的参数,P2是B传给A的参数,P3是A发起的需要传入回调函数的参数。

这里参数P3是一个奇怪的存在,因为P3对于B没有任何意义,但是却不得不在B的接口中体现,
设计上可以称之为“对B的接口打洞”。实际应用中还确实有这种需要。那么如何解决这个问题呢?

还记得标准库中的仿函数算子(Functor)么,譬如std::less,也是一种回调的实现方式,其原理是,
实现一个类(或结构体),重载圆括号运算符,即相当于回调函数。想想使用类有什么好处呢?
对了,类是可以有成员变量滴,哦耶,这下我们可以把参数P3做为Functor类的成员变量了,如果
需要增加P3类参数,也不再影响服务端B了,very ok。

回调的范式2:

{
// 服务端B
struct ICallbackFunctor
{
virtual int operator()(LPARAM P1, LPARAM P2)=0;
};

int ServerFunc(LPARAM P1, ICallbackFunctor fn);

// 客户端A
struct CallbackFunctor : public ICallbackFunctor
{
virtual int operator()(LPARAM P1, LPARAM P2)
{
}

LPARAM P3;
};
}


再说说泛型化,标准库是用模版来实现泛型的,其实使用多态也是可以的,别说想不到,
重载运算符也是可以声明为virtual的,所以完全是可以实现多态的算子的,这样扩展起来更方便了。
...全文

相关推荐

微信分享及回调相应结果

微信分享及回调相应结果

百世修行

微信分享 留在微信没有回调问题

解决微信分享留在微信页面的时候再返回没有成功回调。

Dylan0759

分享帖三相桥式全控整流电路的MATLAB仿真-ThreePhase2_0.mdl

分享帖三相桥式全控整流电路的MATLAB仿真-ThreePhase2_0.mdl 新人求罩,先分享一个simulink模型,如果觉得好的话顶一下,如果觉得不好的话也请指出来:lol:lol:lol    三相桥式全控整流电路的MATLAB仿真:lol:lol  

weixin_39841365

分享帖三相桥式全控整流电路的MATLAB仿真-ThreePhaseli02.mdl

分享帖三相桥式全控整流电路的MATLAB仿真-ThreePhaseli02.mdl 新人求罩,先分享一个simulink模型,如果觉得好的话顶一下,如果觉得不好的话也请指出来:lol:lol:lol    三相桥式全控整流电路的MATLAB仿真:lol:lol  

weixin_39841848

vue 微信分享回调iOS和安卓回调出现错误的解决

产品需求:在微信内分享需要手动配置的分享地址、分享图片与内容描述,引导用户分享,并在微信分享成功回调内进行相应的操作。 首先需要在项目中引入微信jsSDk包,然后通过接口获取后台签名。 封装函数获取微信分享必填参数 其中的jsApiList中填的是需要使用的微信分享js接口的列表,参数URL默认是location.href,即分享当前页面的URL。 在需要分享的页面引入封装的函数 然后通过wxShare方法将URL和配置的参数传入,link参数是分享出去的链接,必须与当前页面的对应js安全域名一致; …shareData就是在函数内传对象,进行解构赋值es6写法 但是在测试过程中发

NEDL001
评论 3
收藏 已收藏
分享
返回顶部
风之子赛拉飞尔
C++ 语言 65,214 成员 250,514 内容