Java属性更改侦听器

时间:2009-08-12 07:16:42

标签: java

我想知道,java beans属性如何改变侦听器的工作方式。 他们在里面使用EventListeners吗? 当我们可以使用POJO实现时,使用属性更改侦听器是否合适 中介模式。我的意思是表现明智吗?

由于 Ĵ

2 个答案:

答案 0 :(得分:6)

优势在于耦合领域。 mediator要求您的类知道中介(例如,通过将中介实例传递给构造函数)。调解员可以非常强大,并且绝对可以提供更有效的通知 - 但代价是显着的复杂性。

相比之下,Observer设计模式(JavaBeans属性更改侦听器是其实现)更容易实现。但是它们可以在复杂的系统中产生有趣的紧急行为。

对于许多情况,Observer绰绰有余(特别是在JavaBeans倾向于使用的领域)。在其他情况下,它远远不够 - 一个很好的例子是Glazed Lists library中的事件传播。他们不得不使用EventPublisher(它是一个中介)来优化事件通知顺序,并确保在事件传播之前满足依赖关系。

因此,您的问题的答案是,这不是POJO与JavaBeans的问题。这是一个设计模式(Observer或Mediator)对于给定的用例最有意义的问题。两种模式都集中在将系统的各部分相互分离。两种模式都有适合的情况。对于大量的情况,Observer很好 - 而且真的非常容易编写。

我还应该提到中间事件对象的使用在Observer和Mediator实现中都很常见,所以这是一个副问题。但是现代虚拟机在处理像这样的短期物体时非常有效 - 所以它确实是一个非问题。

答案 1 :(得分:5)

您要查找的代码位于java.beans.PropertyChangeSupport。你这样使用它:

protected transient PropertyChangeSupport changeSupport = new PropertyChangeSupport (this);

public void addPropertyChangeListener (String propertyName, PropertyChangeListener listener)
{
    changeSupport.addPropertyChangeListener (propertyName, listener);
}

public void removePropertyChangeListener (String propertyName, PropertyChangeListener listener)
{
    changeSupport.removePropertyChangeListener (propertyName, listener);
}

public void firePropertyChange (String propertyName, BigDecimal oldValue, BigDecimal newValue)
{
    if (oldValue != null && newValue != null && oldValue.compareTo (newValue) == 0) {
        return;
    }
    changeSupport.firePropertyChange(new PropertyChangeEvent(this, propertyName,
                                               oldValue, newValue));

}

使用此API的主要优点是每个人都熟悉它。主要的缺点是Beans API相当古老,从现在的角度来看很麻烦,而且非常有限。

例如,您需要许多地方的属性名称。这意味着您必须复制一个字符串(如果重命名该属性,则会中断)或者您必须为每个繁琐的字段手动定义字符串常量。

实现本身非常快,遵循Observer设计模式。当然,还有其他方法可以实现这一点。价格是因为它不遵循API而不再是bean。因此,如果没有额外的胶水代码,您就无法在许多框架中使用您的对象。