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填充对象)?
如果您想使用传统的设计模式方法实现,我建议使用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)
我认为你正在搜索的java.bean.PropertyChangeListener是Java中的Observer-Pattern.
基本上,您向所有setter添加代码以调用该方法,PropertyChangeListener以通知所有观察者该值已更改.
这是正常的Java方式.