gpt4 book ai didi

clojure - 如何以纯函数的方式实现观察者设计模式?

转载 作者:太空宇宙 更新时间:2023-11-03 18:32:28 28 4
gpt4 key购买 nike

假设我想使用 OO 编程语言实现事件总线。我可以这样做(伪代码):

class EventBus

listeners = []

public register(listener):
listeners.add(listener)

public unregister(listener):
listeners.remove(listener)

public fireEvent(event):
for (listener in listeners):
listener.on(event)

这实际上是观察者模式,但用于应用程序的事件驱动控制流。

您将如何使用函数式编程语言(例如 lisp 风格之一)实现此模式?

我问这个是因为如果不使用对象,仍然需要某种状态来维护所有监听器的集合。此外,由于监听器集合会随时间变化,因此不可能创建纯函数式解决方案,对吧?

最佳答案

对此的一些评论:

我不确定它是如何完成的,但是有一个叫做“functional reactive programming”的东西可以作为许多函数式语言的库使用。这实际上或多或少是正确的观察者模式。

此外,观察者模式通常用于通知状态更改,如在各种 MVC 实现中一样。然而,在函数式语言中,没有直接的方法来改变状态,除非你使用一些技巧,比如 monads 来模拟状态。但是,如果您使用 monad 模拟状态更改,您还将获得可以在 monad 中添加观察者机制的点。

从您发布的代码来看,您似乎实际上是在进行事件驱动编程。所以观察者模式是在面向对象语言中获得事件驱动编程的典型方式。所以你有一个目标(事件驱动编程)和一个面向对象世界的工具(观察者模式)。如果您想使用函数式编程的全部功能,您应该检查还有哪些其他方法可用于实现此目标,而不是直接从面向对象的世界移植该工具(它可能不是函数式语言的最佳选择)。只需查看此处提供的其他工具,您可能会找到更符合您目标的工具。

关于clojure - 如何以纯函数的方式实现观察者设计模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6954347/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com