我很欣赏这可能不是一个正确/错误的类型问题,可能更像是一个风格的东西,但我经常发现自己在思考自定义Event
和EventListener
类的使用(过度使用?)。
我经常有一个类(通常是一个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
。
Event
和EventListener
类/接口,即
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类,其中包含对相关更改信息的引用(可能是对事件构造函数中的接口或抽象类的引用)。
然而,令我困扰的是这些小连接器类/接口的大量增加,可能“发生”所有可能只有一个具体实现的“事物”。
所以我想这个问题是;最好只在任何地方使用通用事件/听众,或者总是制作特定类/事件的事件和听众?
我似乎创造了很多这些的主要原因是,我经常发现两个(或更多)类之间的关联往往相当薄弱,它们通常并不真正相互关联方式,但一个人可能对另一个创建/修改的信息/状态感兴趣,但不关心源的细节。我发现观察者或事件/监听器模式是将不相关类之间的耦合保持在最低限度的好方法。
有什么想法吗?提前谢谢,
答案 0 :(得分:1)
在我看来,定义构成域模型的每个event
的特定类型是一种很好的做法(我更喜欢/遵循大多数时间)。拥有尽可能多的事件监听器作为不同的事件类型可能会导致类污染。另一方面,通用侦听器方法可以通过instanceof
的序列或使用Visitor Pattern
来调度事件来确定事件类型。 Visitor Pattern
将事件与听众联系起来。也许在能够使用多个事件(具有相关事件的更改侦听器方法)的侦听器之间进行折衷,将通过保留特定于事件的消耗来减少不同侦听器的数量,从而避免instanceof
的序列。
正确的解决方案取决于具体项目,并且始终是许多方面的权衡。