【问题标题】:Is n:1 observable:observer with generics possible in java? ( observer pattern )n:1 observable:observer 是否可以在 java 中使用泛型? (观察者模式)
【发布时间】:2015-04-29 23:29:21
【问题描述】:

我想听听您对应用观察者模式的意见。

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

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

public class ConcreteObserver implements EventObserverA , EventObserverB {

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

}

在这种情况下,我应该使用几乎相同的代码 sn-p 编写许多不同的观察者/可观察类/接口。

为了避免像上面这样的麻烦,我想泛化观察者/但是你们知道多重继承规则不允许像下面这样的代码。

public class ConcreteObserver implements Observer<EventA> , Observer<EventB> {

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

}

因为我有至少两位数的 Observable 事件要在一个具体的观察者中观察,所以我想尽可能避免单独实现每个观察者/可观察对。

我可能猜想这种情况可能有比观察者模式更好的模式,因为观察者模式是为 n:1 observer:observable 而设计的,而我的案例需要 1:n observer:observable 。

你们对这个案例有什么想法/建议吗?

【问题讨论】:

  • update(Observer&lt;EventA&gt; event) 是错字,对吧?我猜你的意思是update(EventA event)
  • 是的,你是对的,我修复了代码。谢谢
  • 如果EventAEventB 可以扩展一个通用类,您可以将泛型用作public class ConcreteObserver implements Observer&lt;E extends CommonEvent&gt;,那么您不需要为每个观察者创建一个方法,只需update(E event);
  • 感谢您的建议,这似乎是减少麻烦的好方法。

标签: java generics design-patterns observer-pattern


【解决方案1】:

借助 Java 8 的魔力,您的 ConcreteObserver 不一定要实际实现 Observer&lt;EventA&gt;Observer&lt;EventB&gt;;如果你写这样的东西:

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

那么您可以在ConcreteObserver 实例上使用::updateEventA::updateEventB 来获取可自动转换为Observer&lt;EventA&gt;Observer&lt;EventB&gt; 功能接口的方法。例如,您可以编写以下任何内容:

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

【讨论】:

  • 太棒了,不仅对我来说,这肯定会给许多设计带来巨大的灵活性。谢谢你的建议!
猜你喜欢
  • 2021-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-02
  • 1970-01-01
  • 2013-03-05
  • 2021-09-25
相关资源
最近更新 更多