有没有一种设计模式可以处理回调机制?

37

有没有一种处理回调机制的设计模式?

10个回答

28

这是 观察者模式 - 来自维基百科

观察者模式(异步发布/订阅模式的子集)是一种软件设计模式,其中一个称为主题的对象维护其称为观察者的依赖项列表,并通过调用它们的某个方法自动通知它们任何状态更改。它主要用于实现分布式事件处理系统。


7
观察者模式类似于发布-订阅模式,而不是回调。观察者模块在调用可观察模块后不会被“回调”。可观察对象调用观察者以通知它们状态的更改。 - Paulo Merson

22

这取决于回调函数的使用方式。

设计模式都是关于传达您的意图。

如果您打算注册一个或多个回调并且它们可以在“将来的某个时间点”作为通知进行调用,那么您正在谈论观察者模式。此外,这种情况下回调的实际调用通常是“可选的”或基于某些刺激触发。(回调可能永远不会被调用)

如果您想传入“要执行的内容”,并且该方法中会执行它(或在稍后的过程中用于“执行某些操作”),则您正在谈论策略模式。此外,实际的调用通常会发生。

请注意,完全相同的代码可能是两种模式之一,这取决于您对问题的思考方式以及希望他人如何考虑。


12

2
"Visitor" 实现双重分派,与回调无关。"Observer" 实现发布-订阅模式,类似于回调,但不同。"Strategy" 实现一等函数,与回调无关。 - jaco0646
1
我在之前的回答中也回复了您;一等函数本身并没有使它们作为回调函数无法使用。事实上,策略模式可能是向某人解释回调函数最简单的方法,因为它不需要介绍异步执行的概念。 - BigJMoney

9

回调函数是一种策略设计模式


3
我同意策略模式比观察者模式更好。对我来说,回调指的是函数指针或闭包。由于这些构造在所有语言中都不可用,所以策略模式是最接近的近似方式。根据你的视角,你需要创建所选设计模式所需的各种接口,这可能是(不幸的)必要的。 - Patrick
2
“Strategy” 实现了一等函数,与回调无关。 - jaco0646
一等函数确实可以作为回调函数,参见 https://developer.mozilla.org/zh-CN/docs/Glossary/First-class_Function 和 https://developer.mozilla.org/zh-CN/docs/Glossary/Callback_function。 - BigJMoney

4

外部多态性 - 一个对象具有对另一个对象的引用和调用该对象函数的功能。它可以被视为单个类型,因此可以混合和匹配对象和要调用的函数以响应事件。委托是这种模式的一个例子。这更像是C#风格的方法。

观察者模式 - 您可以使用实现接口/基类的对象,并将此接口注册到事件中。更像是Java风格的方法。

在此处检查我发布的答案以获取关于委托/外部多态性的C++解决方案: 从绑定方法获取原始函数指针


2
一种很好的模式描述是服务回调设计模式。它是SOA模式目录的一部分,但如所描述的该模式可用于非SOA服务的通用组件中。
另一个相关的模式是在Hohpe和Woolf的经典书籍“企业集成模式”中描述的返回地址模式
Josuttis在他的书“实践中的SOA”中也谈到了回调。他称之为请求/回调消息交换模式

1

你的问题相当一般化,我能想到最一般化的回答就是在需要回调的问题上使用多态。

多态能够让你通过接口(或抽象类)来规定回调函数的软件契约,然后客户端可以自由选择适合他们目的的任何接口实现。

无论是否建议使用状态、策略、观察者模式,或者完全不同的东西,这真的取决于具体情况。


0

0

我也同意其他帖子中提到的观察者模式。它是专门为此目的设计的。


0
《设计模式》第235页:

“命令(命令模式)是回调函数的面向对象替代方案。”


虽然这个链接可能回答了问题,但最好在此处包含答案的基本部分并提供参考链接。如果链接页面更改,仅有链接的答案可能会失效。-【来自审查】 - beeselmane

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接