Java中是否可能使用泛型实现n:1可观察者模式(观察者模式)?

5

我希望听听你对应用观察者模式的意见。

我的目标是实现一个具体的观察者类,可以监听多个可观察对象。

如果我像下面这样开发每个不同的观察者,那么就会很简单:

public class ConcreteObserver implements EventObserverA , EventObserverB {

    updateEventA(EventA event) {}
    updateEvetnB(EventB event) {}

}

在这种情况下,我应该编写许多不同的观察者/可观察类/接口,其中几乎包含相同的代码片段。
为了避免上述烦恼,我想要通用化观察者/但是你们知道多重继承规则不允许如下的代码。
public class ConcreteObserver implements Observer<EventA> , Observer<EventB> {

    update(EventA event) {}
    update(EventB event) {}

由于我至少有两位具体观察者需要观察的可观察事件,如果可能的话,我希望避免分别实现每个观察者/可观察者对。

我猜这种情况下可能会有比观察者模式更好的设计模式,因为观察者模式是为 n:1 观察者:可观察对象而设计的,而我的情况需要 1:n 观察者:可观察对象。

您们有关于这种情况的任何想法/建议吗?


1
update(Observer<EventA> event) 是打错字了,对吧?我猜你是想说 update(EventA event) 吧? - ruakh
是的,你说得对,我修复了代码。谢谢。 - BinaryProbe
3
如果EventAEventB可以扩展一个共同的类,那么你可以使用泛型作为public class ConcreteObserver implements Observer<E extends CommonEvent>,然后你就不需要为每个观察者创建一个方法,只需要update(E event);即可。 - Jorge Campos
谢谢您的想法,这似乎是减少麻烦的好方法。 - BinaryProbe
1个回答

6

借助Java 8的魔力,您的ConcreteObserver不一定需要实际实现Observer<EventA>Observer<EventB>。如果您编写以下代码:

public class ConcreteObserver {
    observeEventA(EventA event) {}
    observeEventB(EventB event) {}
}

然后,您可以在ConcreteObserver实例上使用::updateEventA::updateEventB来获得一个方法,该方法会自动转换为Observer<EventA>Observer<EventB>功能接口。例如,您可以编写以下任何一种:

  • Observer<EventA> eventAObserver = concreteObserver::updateEventA;
  • Observer<EventB> eventAObserver = new ConcreteObserver()::updateEventB;
  • observerRegistry.register(EventA.class, concreteObserver::updateEventA);

太棒了,不仅对于我的情况如此,这肯定会在许多设计上提供巨大的灵活性。 谢谢你的建议! - BinaryProbe

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