Java对象,更改字段侦听器,设计模式

Ale*_*lex 4 java design-patterns

有一节课:

public class MyClass {
private String field1;
private String field2;
private String field3;
// getters, setters
}
Run Code Online (Sandbox Code Playgroud)

然后我们更新一些字段

MyClass myClass = new MyClass();
myClass.setField1("field1");
myClass.setField2(null);
Run Code Online (Sandbox Code Playgroud)

如何知道MyClass的哪些字段被尝试更改(在上面的field1和field2中的示例中调用)?
什么是最好的解决方案?也许有些设计模式?
一个选项是HashSet为此对象创建更改的字段作为附加属性,并在每个setter中更新它,但它似乎不太好.
它应该像Proxy对象那样拦截所有方法调用(即setXXX())(通过Java反射?)或其他什么?

更新
似乎每个setter都应该调用一些内部方法,正如我所说的那样.我不需要通知任何其他对象有关更改.我想将所有状态存储在此对象中,以后可以访问这些更改.
详细信息:如果调用方法setFieldX,则应将fieldX标记为稍后更新
PS所有字段具有不同的名称.
除了反射之外的任何其他解决方案(我想通过纯setter填充对象)?

san*_*hat 8

如果您想使用传统的设计模式方法实现,我建议使用Observer Pattern

为您的班级设置场地事件的监听器

public interface FieldListener {

    public void fieldValueChanged(String fieldName, Object newValue);
}
Run Code Online (Sandbox Code Playgroud)

使类实现此侦听器(Observer)

public class SampleObserver implements FieldListener {

    @Override
    public void fieldValueChanged(String fieldName, Object newValue) {
        System.out.println(fieldName + " - got set with value - " + newValue);
    }

}
Run Code Online (Sandbox Code Playgroud)

在Observable类(在你的情况下MyClass)中为你的监听器设置一个占位符,每当调用set方法时,只需触发事件.

public class MyClass {

    List<FieldListener> listeners = new ArrayList<FieldListener>(); // the placeholder for listeners

    private String field1;
    private String field2;

    /**
     * @param field1 the field1 to set
     */
    public void setField1(String field1) {
        fireEvent("field1", field1);
        this.field1 = field1;
    }
    /**
     * @param field2 the field2 to set
     */
    public void setField2(String field2) {
        fireEvent("field2", field2);
        this.field2 = field2;
    }

    public void addListener(FieldListener l) {
        if(l != null) listeners.add(l);
    }

    public void fireEvent(String fieldName, Object newValue) {
        for(FieldListener l : listeners) {
            l.fieldValueChanged(fieldName, newValue);
        }
    }

    public static void main(String [] args) {
        MyClass m = new MyClass();
        m.addListener(new SampleObserver());
        m.setField1("s");
        m.setField2("v");
    }

}
Run Code Online (Sandbox Code Playgroud)


Uwe*_*nus 5

我认为你正在搜索的java.bean.PropertyChangeListener是Java中的Observer-Pattern.

基本上,您向所有setter添加代码以调用该方法,PropertyChangeListener以通知所有观察者该值已更改.

这是正常的Java方式.