Language agnostic 回调模式/习惯用法有哪些好的用例?

Language agnostic 回调模式/习惯用法有哪些好的用例?,language-agnostic,design-patterns,Language Agnostic,Design Patterns,我不使用这种模式,也许在某些地方它是合适的,而我使用了其他模式。你在日常编码中使用过吗?请随意使用您选择的语言提供示例以及您的解释。NET平台大量使用回调来实现Observer模式 它们还用于处理异步进程。Objective C和Cocoa框架大量使用了它。例如,NSURLConnection,当连接上发生某些事情时,它将通知给它的对象(称为它的委托): NSURLConnection *foo = [[NSURLConnection alloc] initWithRequest:request

我不使用这种模式,也许在某些地方它是合适的,而我使用了其他模式。你在日常编码中使用过吗?请随意使用您选择的语言提供示例以及您的解释。

NET平台大量使用回调来实现Observer模式


它们还用于处理异步进程。

Objective C和Cocoa框架大量使用了它。例如,
NSURLConnection
,当连接上发生某些事情时,它将通知给它的对象(称为它的委托):

NSURLConnection *foo = [[NSURLConnection alloc] initWithRequest:request delegate:self];
请注意此处传递的
委托
。请求在后台进行,然后实例将向代理发送消息(在本例中为
self
),如:

你明白了。我相信这就是所谓的“观察者模式”。这一切都与Cocoa的事件循环有关(据我所知,我仍在学习),而且是一种廉价且简单的异步编程。各种语言中的许多框架都遵循这种方法


.NET也有类似的委托。思考事件。

我在javascript中大量使用它来让我知道异步调用何时完成,以便可以处理结果

但是,在javascript中,现在在C#3中,我将函数作为参数传入,这样处理就可以继续进行,而无需显式设置要调用的委托。

回调实际上不是一种“模式”——更像是一个构建块。许多方法以类似回调的方式使用虚拟方法。贾斯汀·尼斯纳已经提到

回调比OOP早得多(可能比3GLs甚至汇编程序早)。另一个古老的想法是参数块——C解释是一个结构,其中包含要传递给函数的相关成员,因此函数不需要庞大的参数列表

OOP类建立在参数块的基础上(并为其添加了一种原理)。类实例本身是通过引用传递给其方法的参数块。虚拟表是一个调度处理参数块。每个虚拟方法在分派处理参数块中都有一个回调指针。纯虚拟方法在参数块中为回调指针保留空间,并承诺稍后提供实际指针

由于类是面向对象设计模式的构建块,而参数块和回调是类的构建块,因此,您可以声称所有OOP设计模式都是基于这些思想构建的


我想说“参数块和回调,加上指导它们使用的样式规则,激发了面向对象的灵感”,但尽管听起来很吸引人,我不知道这是不是真的。

我几乎每天都在以下场景中使用回调:

  • 事件:当用户在控件上单击鼠标、按键或以我需要处理的方式与UI交互时,我订阅控件为事件发布的委托。然后,我可以通过更新UI、在某些情况下取消事件或采取一些特殊措施来处理它

  • 多线程编程:在编程GUI时,保持UI响应并向用户指示长时间运行的后台事件的进度非常重要。为此,我在一个单独的线程中启动任务,然后发布委托(在.NET世界中的事件),这些委托为我的UI提供了通知用户正在发生的进展的机会

  • Lambda函数:在.NET中,Lambda函数是委托的一种形式,它允许我在稍后的时间点与另一段代码的操作进行交互。LINQ就是一个很好的例子。我可以创建一个小的匹配函数,然后将其提供给LINQ查询。稍后,当我对集合执行查询时,将调用matching函数来确定查询是否匹配。这使我不必构建或担心查询机制。我只需要告诉查询机制去哪里查找比较是否匹配


我敢肯定,这些例子只是表面现象。但它们是我如何每天使用回调的有用示例。

有几种称为“回调模式”;请提供一个简短的定义,以便我们知道您所说的是哪一个。
connectionDidFinishLoading:
connection:didFailWithError: