代码之家  ›  专栏  ›  技术社区  ›  non sequitor

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

  •  2
  • non sequitor  · 技术社区  · 16 年前

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

    5 回复  |  直到 16 年前
        1
  •  1
  •   jasonh    16 年前

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

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

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

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

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

        2
  •  2
  •   Steve314    16 年前

    gang of four design patterns 以类似回调的方式使用虚拟方法。贾斯汀·尼斯纳已经提到 Observer

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

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

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

        3
  •  1
  •   Justin Niessner    16 年前

    NET平台大量使用回调来实现观察者模式。

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

        4
  •  0
  •   Jed Smith    16 年前

    目标C和Cocoa框架大量使用了它。例如 NSURLConnection ,它将通知给它的对象(称为 代表 )当连接上发生某种情况时:

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

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

    connectionDidFinishLoading:
    connection:didFailWithError:
    

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

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

        5
  •  0
  •   James Black    16 年前

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

    推荐文章