【问题标题】:JAVA - Best way for raising eventJAVA - 举办活动的最佳方式
【发布时间】:2012-02-16 21:58:00
【问题描述】:

我有一个关于我的小IRC框架设计的问题,只是为了学习JAVA事件和观察者..

第一个问题: http://en.wikipedia.org/wiki/Observer_pattern#Critics

观察者模式被批评[6] 过于冗长、引入太多错误和违反软件工程原则,例如不提倡副作用、封装、可组合性、概念分离、可伸缩性、统一性、抽象、资源管理,语义距离。推荐的方法是逐渐弃用观察者,转而支持反应式编程抽象。

我应该在生产程序中使用观察者模式,如果被批评并且将来可能会被弃用? java.util.observer 总是一个不错的选择?

第二个问题:我有两个对象。服务器和频道

Server.java

public Server {
    public Server () {
        // Some stuff
        channelList = new ArrayList<Channels>();
    }

    public Channel searchChannel(String channel) {
        // Implements searching channel
    }

    public void parseMessage() {
        if (someCondition1)
           onEvent1();
        elseif (someCondition2)
           onEvent2();
    }

    public void onEvent1(String channel, String param) {
        channel = searchChannel(channel);
        channel.onEvent1(param);
    }

    public void onEvent2(String channel, String param) {
        channel = searchChannel(channel);
        channel.onEvent2(param);
    }
}

** Channel.java**

public Channel {
    public Channel(Server server) {
         // Some stuff
         this.server = server;
    }

    public void onEvent1(String channel, String param) {
        // Stuff for Event1 fired from Server
        server.responseAtEvent("blablabla");
    }

    public void onEvent2(String channel, String param) {
        // Do stuff for Event2 from Server
        server.responseAtEvent("blablabla");
    }

在这种情况下,在频道中,我将所有方法公开,并且从服务器类调用这些方法... 有更好的方法来管理事件处理吗?我在考虑 ObserverPattern,但我猜它更多用于 GUI 的东西,因此是业务逻辑类..

干杯


我想问关于观察者的另一件事...... 为什么很多人不喜欢 JDK 观察者模式并建议实现你的?
为什么要重新发明轮子?

我看到的重新实现的观察者是 JDK 的同一个观察者...

【问题讨论】:

    标签: java model-view-controller events observer-pattern raiseevent


    【解决方案1】:

    您不必使用 Java 的观察者接口。 它甚至没有使用泛型。 但你可以实现自己的观察者 DP。

    关于您的服务器/频道 我在其中看到的问题是扩展它会是一个问题。 如果您将来有一个新事件:event3,会发生什么?

    我建议你可以在服务器中有一个监听器列表。 一旦事件到来,所有事件都被激活。 每个监听器都可以由一个具体的类来实现。 每个具体类都会检查条件,如果满足,则执行。

    【讨论】:

    • 我的第一个问题是关于公开所有方法。我认为这不是封装的好方法...所以我必须在服务器类中编写一个方法,如“public void spamMessage(message)”到与该服务器关联的每个频道...
    • 当然,公共方法会破坏封装。但是你不想把这项工作交给频道吗?这样,服务器只需将事件传递给侦听器,每个侦听器都会做它需要做的事情。
    • 是的,我在 python 中编写了一个以这种方式工作的小框架。但是有点简单(没有静态错字,没有公共/私有)。 - 你能建议一些注意和实现监听器/事件监听器的技巧吗?谢谢
    【解决方案2】:

    在您引用的段落上方,维基百科显示以下注释:

    本文的批评或争议部分可能会损害文章对该主题的中立观点。

    因此,这应被视为一种观点,而不是既定事实。

    该声明的唯一参考是一篇显然尚未在任何同行评审期刊上发表的论文,该论文中描述的技术也没有得到任何广泛应用。因此,这只是一个想法。也许是一个很有前途的想法,但仍然只是一个想法。

    另一方面,观察者模式已经被应用了无数次。它的缺陷和局限性已被彻底探索,这些缺陷都不足以成为弃用所有可能应用的模式的充分理由。

    维基百科的人似乎得出了相同的结论。

    所以,如果你想要一个已知的数量,并且不想学习新的编程语言和新的范式来改进观察者模式,我会将科学探索留给科学家,并坚持现在是经典的观察者模式。

    【讨论】:

      猜你喜欢
      • 2012-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多