0

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

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

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

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

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

服务器.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的同一个观察者......

4

2 回答 2

0

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

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

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

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

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

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

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

于 2012-02-16T22:56:26.167 回答
0

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

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

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

于 2012-02-16T22:34:36.057 回答