CALLBACK模式/习语的一些好用例是什么?

时间:2009-10-08 17:38:30

标签: language-agnostic design-patterns

我没有使用这种模式,也许有些地方适合我使用其他东西。你有没有在日常编码中使用它?您可以用您选择的语言提供样品,并附上您的解释。

5 个答案:

答案 0 :(得分:2)

回调并不是一种“模式” - 更像是一个构建模块。许多gang of four design patterns以类似回调的方式使用虚拟方法。 Justin Niessner已经提到了Observer

回调比OOP早(并且可能比3GL甚至汇编程序更旧)。另一个古老的想法是参数块--C解释是一个完整的相关成员的结构,要传递给函数,这样函数就不需要大的参数列表。

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

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

我希望能够说“参数块和回调,以及引导它们使用的样式规则,启发面向对象”,但听起来很吸引人,我不知道它是否属实。

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

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

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

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

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

答案 3 :(得分:0)

Objective C和Cocoa框架大量使用它。一个例子是NSURLConnection,它会在连接上发生某些事情时通知给定的对象(称为委托):

NSURLConnection *foo = [[NSURLConnection alloc] initWithRequest:request delegate:self];

注意delegate在那里的传递。请求在后台进行,然后实例将向委托发送消息(在本例中为self),如:

connectionDidFinishLoading:
connection:didFailWithError:

你明白了。我相信这被称为“观察者模式”。这一切都与Cocoa的事件循环相关(据我所知,我还在学习)并且很容易进行异步编程。许多语言中的许多框架都遵循这种方法。

.NET也有代表,它们是相似的。想想事件。

答案 4 :(得分:0)

我在javascript中使用它很多,让我知道异步调用何时完成,因此可以处理结果。

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