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