【发布时间】:2021-04-04 01:56:51
【问题描述】:
我查看了 Java 中观察者模式的许多实现,但似乎没有一个能完全按照我的意愿运行。
在我熟悉的编程语言中,可以创建一个事件对象,该对象可以由侦听器“连接”到,并由可观察对象“触发”。示例见下面的伪代码。
class MyObservable {
public Event myEvent1
public Event myEvent2
public fireEvent1() {
myEvent1:Fire()
}
public fireEvent2() {
myEvent2:Fire()
}
}
class MainClass {
private onMyEvent1() {
print("my event 1 fired")
}
private onMyEvent2() {
print("my event 2 fired")
}
public MainClass() {
myObservable = new MyObservable()
// Pass in the function that i want to be called
// when myEvent1 is fired.
myObservable.myEvent1.Connect(onMyEvent1)
// Pass in the function that i want to be called
// when myEvent2 is fired.
myObservable.myEvent1.Connect(onMyEvent2)
}
}
我在 Java 中看到的所有实现都需要我为每个事件创建一个单独的接口。这似乎非常费力。我也有监听许多事件的类,这意味着我的监听器实现了多达 10 个接口,这对我来说似乎不正确。在 Java 中真的没有更好/更快的方法来实现观察者模式吗?
非常感谢上述伪代码中 Java 中的最小等效代码,或者只是指向 Java 中观察者模式的良好实现的链接!
编辑:我忘了提到可以将可变数量的参数传递给 fire() 方法(抱歉,不是在伪代码实现中!)。
例如在myEvent1.fire(5,3)中,数字5和3可以用在fireEvent1(int num1, int num2)中
【问题讨论】:
-
Java 中的
Observable类可能会有所帮助。这是one example -
您也可以使用 Google AspectJ - 然后您可以使用注释,而不必担心从可观察对象调用代码。不过请注意,这种方法就像用原子弹击中树桩。
-
您也许可以节省一些工作并使用 Proxy 类,但在这里您不会过多地考虑您的要求。 docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/…
标签: java observer-pattern