"Deprecating the Observer Pattern" -- 其他语言的代码示例?

"Deprecating the Observer Pattern" -- code examples in some other language?

我正在尝试理解论文 Deprecating the Observer Pattern,它似乎对 "Reactive" 编程的发展有一定影响。

然而,所有示例都是在 Scala 中,这阻碍了我的理解。 有没有人将这些示例翻译成更广为人知的语言,例如 Java 或 JavaScript?或者是否有超过 7 人使用的语言的类似介绍和示例? :)

如果这属于不同的堆栈,请告诉我。

您可能对 RxJava 感兴趣?说明:

Reactive Extensions for the JVM – a library for composing asynchronous and event-based programs using observable sequences for the Java VM.

This page 使用 Java 7 en 8 解释了响应式编程(7 中所示的示例)。例如:

Integer[] numbers = { 0, 1, 2, 3, 4, 5 };

Observable numberObservable = Observable.from(numbers);

numberObservable.subscribe(
        new Action1<Integer>() {
            @Override
            public void call(Integer incomingNumber) {
                System.out.println(incomingNumber);
            }
        },
        new Action1<Throwable>() {
            @Override
            public void call(Throwable error) {
                System.out.println("Error in synchronous observable");
            }
        },
        new Action0() {
            @Override
            public void call() {
                System.out.println("This observable is finished");
            }

        }
);

文章认为观察者模式会导致很多错误,因为它很难推理(需要使用 side-effects 来维护状态,缺乏一致性,控制反转,...)并且它是难以对其应用良好实践(关注点分离、封装等)。

然后继续展示如何使用 Scala.React 库从 observable-based 代码库过渡到反应式代码库。

在这个答案中,我将使用 "scalenglish" 和 "javenglish" 来尝试解释我理解的代码。

第一步(项目 2)是创建事件抽象。使用 Event,您现在拥有一个可用于封装可观察对象的统一接口。然后它继续定义 "merge" 方法,然后允许组合不同的事件。

第二步(第3项)是解决控制反转问题。为此,他们使用 Scala.React 库定义了一个 DSL,可以将其翻译为:

var state = null
observe(event1).then{
    state = new StartState()
    remove_observer(event1)
    observe(event2).then {
        state = new AccumulateState(old_state+new_data)
    }
    observe(event3).then {
        do_something()
        state = null
        remove_observer(event2)
        remove_observer(event3)
    }
}

进入:

once {
   state = new StartState(when(event1))
   until(event3) {
      state = new AccumulateState(when(event2))
   }
   do_something()
}

该库透明地定义了将等待预期事件但不会停止程序执行的函数。在上面的代码中,方法 "once" 和 "when" 以及 "until" 负责等待事件并在预期时继续执行代码。您还可以看到,在第二个片段中,您不需要 associate/remove 观察者。

第三步(第 4 项)是创建信号。 Signal 是一个 time-varying 值,您可以使用它来定义如何评估此时信号的值("now" 方法)和观察信号变化("changes" 方法)通过返回与信号关联的事件。 (作为旁注,scala 中的特征与 java 中的接口相同,但增加了在特征本身中实现一些所需行为的可能性。)

第四步(第 5 项)是将 Signal 和 Event 集成到 Scala.Reactor 中。它使 Signal 和 Event 特征扩展了 Reactive 特征,并解释了(在 Scala 中)如何定义将事件和信号转换为数据流的方法 implicitly(user-defined 隐式转换是我试图在其他语言上找到的东西,但它似乎是一个 scala-only 功能)。

然后它定义了组合器(对任何数据流进行操作的统一方法)并解释了这样做时发现的问题。

第 6 项接着解释了它是如何在 scala 中实现的。

第7项列出了其他languages/libraries(包括Java)

的相关作品