适当使用Event-Listener模式

时间:2014-03-12 09:36:47

标签: java events event-handling observer-pattern

我很欣赏这可能不是一个正确/错误的类型问题,可能更像是一个风格的东西,但我经常发现自己在思考自定义EventEventListener类的使用(过度使用?)。

我经常有一个类(通常是一个GUI组件)需要让其他组件知道它状态的某些变化。

我可以维护一个ChangeListener s列表(或其他一些已定义的通用监听器类型),然后在状态更改时调用它们,例如:

for (final ChangeListener cl : changeListeners)
    cl.stateChanged(new ChangeEvent(this));

然后检索侦听器中的值:

class SomeListener implements ChangeListener {
    @Override
    public void stateChanged(ChangeEvent e) {
        ((MyClass) e.getSource()).getSomeStateProperty();
        .
        .
        .
    }

然而,对MyClass的强制转换让我感觉不好,因为侦听器类现在正在明确假设ChangeEvent的内容尚未明确声明为ChangeEvent构造函数采用类型Object

所以我经常发现自己创建了一对自定义EventEventListener类/接口,即

public interface SomeThingChangeListener extends EventListener {
    /**
     * Invoked when the target of the listener has changed some thing.
     *
     * @param e a SomeThingChangeEvent object
     */
     void someThingChanged (SomeThingChangeEvent e);
} 

使用相应的Event类,其中包含对相关更改信息的引用(可能是对事件构造函数中的接口或抽象类的引用)。

然而,令我困扰的是这些小连接器类/接口的大量增加,可能“发生”所有可能只有一个具体实现的“事物”。

所以我想这个问题是;最好只在任何地方使用通用事件/听众,或者总是制作特定类/事件的事件和听众?

我似乎创造了很多这些的主要原因是,我经常发现两个(或更多)类之间的关联往往相当薄弱,它们通常并不真正相互关联方式,但一个人可能对另一个创建/修改的信息/状态感兴趣,但不关心源的细节。我发现观察者或事件/监听器模式是将不相关类之间的耦合保持在最低限度的好方法。

有什么想法吗?

提前谢谢,
西蒙。

1 个答案:

答案 0 :(得分:1)

在我看来,定义构成域模型的每个event的特定类型是一种很好的做法(我更喜欢/遵循大多数时间)。拥有尽可能多的事件监听器作为不同的事件类型可能会导致类污染。另一方面,通用侦听器方法可以通过instanceof的序列或使用Visitor Pattern来调度事件来确定事件类型。 Visitor Pattern将事件与听众联系起来。也许在能够使用多个事件(具有相关事件的更改侦听器方法)的侦听器之间进行折衷,将通过保留特定于事件的消耗来减少不同侦听器的数量,从而避免instanceof的序列。

正确的解决方案取决于具体项目,并且始终是许多方面的权衡。