10

我注意到有些人编写的 bean 支持 Property Change 观察者模式。

import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.io.Serializable;

public class SampleBean implements Serializable {
    public static final String PROP_SAMPLE_PROPERTY = "sampleProperty";
    private String sampleProperty;
    private PropertyChangeSupport propertySupport;

    public ChartBean() {
        propertySupport = new PropertyChangeSupport(this);
    }

    public String getSampleProperty() {
        return sampleProperty;
    }

    public void setSampleProperty(String value) {
        String oldValue = sampleProperty;
        sampleProperty = value;
        propertySupport.firePropertyChange(PROP_SAMPLE_PROPERTY, oldValue, sampleProperty);
    }


    public void addPropertyChangeListener(PropertyChangeListener listener) {
        propertySupport.addPropertyChangeListener(listener);
    }

    public void removePropertyChangeListener(PropertyChangeListener listener) {
        propertySupport.removePropertyChangeListener(listener);
    }
}

然而,我记得读到观察者模式在基于 Web 的 MVC 模式中并不常用,因为 Web 应用程序的无状态特性。

在Web 应用程序Java bean中遵循上述模式是一种好习惯吗?

4

3 回答 3

10

老实说,只有在您确实需要该功能时才打扰。大多数 Web 应用程序不需要PropertyChangeSupport. 我实际上不记得看到它在我见过的任何网络应用程序中使用。我只看到它被用作 Swing 应用程序。

Web 应用程序中的一个典型例子bean是一个生命周期很短的对象,它准备为单个请求提供服务,然后被扔到空白中以进行垃圾收集。主要问题是,Web 应用程序是我的自然并发和多用户,这不适合具有侦听器和事件等的更长寿的对象。

于 2009-06-09T19:17:02.173 回答
3

PropertyChangeListener无论如何是一个相当糟糕的设计 - 所有这些神奇的字符串比较。最好选择带有ChangeListener(或类似)的简单模型并与复合模型结合在一起。

除非您正在做一些交互式的和 COMETy 的事情,否则它在 Web 应用程序中没有多大意义。您通常有一个拉模型,其中所有当前信息都一次性捆绑在一起。有缓存的地方可能有意义。

您甚至可以像 webapps 一样编写桌面应用程序。任何更改(或一系列更改)并同步 GUI。事实证明这是非常紧凑的。此外,性能成本从重大变化的关键时间(例如打开窗口)转移到您有周期要燃烧的非关键时间。

于 2009-06-09T19:45:26.513 回答
3

1) 除非你知道你需要它,否则不要添加属性更改支持。

2)如果您的 bean 只是一个值对象,仅具有 getter/setters/equals/hashcode,那么请考虑使用 AOP 框架(我喜欢 Spring)将对象与用于实现属性更改事件/支持的建议一起包装。这样,您的 bean 就不会受到仅在某些上下文(通常是 UI)中需要并且可能在不同上下文中发生变化的逻辑的污染。这是我在为特定应用程序的所有域 bean 添加属性更改支持时学到的一课 - UI 使用了它,但它混淆了服务器团队(在那里没有使用),并且在不使用它的地方只是噪音。

我也同意,有时您不需要监听单个属性,只要知道对象中的任何内容是否发生了变化就足够

于 2009-07-29T17:10:22.660 回答