Java 使用复杂模型实现MVC的正确方法,无需类型检查和if-else链

Java 使用复杂模型实现MVC的正确方法,无需类型检查和if-else链,java,oop,design-patterns,model-view-controller,architecture,Java,Oop,Design Patterns,Model View Controller,Architecture,我正试图按照MVC体系结构编写一个应用程序,更具体地说是以下方法: 控制员: public class Controller{ ... public void newName() { model.setName(name); } public void newFoo() { model.setFoo(foo); } public void newBar() { model.setBar(bar)

我正试图按照MVC体系结构编写一个应用程序,更具体地说是以下方法:

控制员:

public class Controller{
    ...

    public void newName() {
        model.setName(name);
    }

    public void newFoo() {
        model.setFoo(foo);
    }

    public void newBar() {
        model.setBar(bar);
    }
}
模型:

public class Model{
    ...

    public void setName(String name) {
        this.name = name;
        update();
    }

    public void setFoo(String foo) {
        this.foo = foo;
        update();

    }    
    public void setBar(String bar) {
        this.bar = bar;
        update();
    }

    // Update implemented like this:
    private void update() {
        setChanged();
        // calls update(...) on observers
        notifyObservers();
    }
}
观点:

public class View{
    ...

    public void update(Observable o, Object arg) {
        Model model = (Model) o;
        fieldName.setText(model.getName());
        fieldFoo.setText(model.getFoo());
        fieldBar.setText(model.getBar());
    }
}
我的问题是,如果我不想同时更新整个视图,就像更新视图中的name、foo和bar一样,我必须进行类型检查或创建if-else链,以测试更新了哪个字段

如果我使用侦听器,我可以为每个字段实现一个具体的方法调用

然而,我觉得这两种方法都有良好的OOP和可修改性/松耦合等缺陷。如果模型中有100个字段,会发生什么?100个单独的if/方法

所以我想我要问的是,在OOP和可修改性方面,只更新
update()
中的必填字段而不必更新所有内容的最佳方式是什么

我能用多态性解决这个问题吗


我很抱歉问了这么一个可能很宽泛的问题,但我已经为此挣扎了一段时间,我没有找到任何其他线索,我觉得可以给我一个好的答案,所以我想我应该尝试做我自己的线索。我可能找不到类似的线索,因为我真的不知道该搜索什么。

如果我有点不对劲,请原谅

可以使用ID将所有字段封装在集合对象中。在update调用中,需要设置的ID/ID将被传入。然后:

  • 使用ID搜索集合对象
  • 根据该字段的ID更新该字段
  • 这样可以避免在只更新了几个字段甚至一个字段时,必须使用旧日期更新每个字段。甚至可以作为一种安全层

    这是一个有点远的镜头,但当你处理数百个独特的领域;最终一定会变得有点难看


    希望能给你一点启发

    如果我有点不舒服,请原谅

    可以使用ID将所有字段封装在集合对象中。在update调用中,需要设置的ID/ID将被传入。然后:

  • 使用ID搜索集合对象
  • 根据该字段的ID更新该字段
  • 这样可以避免在只更新了几个字段甚至一个字段时,必须使用旧日期更新每个字段。甚至可以作为一种安全层

    这是一个有点远的镜头,但当你处理数百个独特的领域;最终一定会变得有点难看


    希望能给你一点启发

    如果我有点不舒服,请原谅

    可以使用ID将所有字段封装在集合对象中。在update调用中,需要设置的ID/ID将被传入。然后:

  • 使用ID搜索集合对象
  • 根据该字段的ID更新该字段
  • 这样可以避免在只更新了几个字段甚至一个字段时,必须使用旧日期更新每个字段。甚至可以作为一种安全层

    这是一个有点远的镜头,但当你处理数百个独特的领域;最终一定会变得有点难看


    希望能给你一点启发

    如果我有点不舒服,请原谅

    可以使用ID将所有字段封装在集合对象中。在update调用中,需要设置的ID/ID将被传入。然后:

  • 使用ID搜索集合对象
  • 根据该字段的ID更新该字段
  • 这样可以避免在只更新了几个字段甚至一个字段时,必须使用旧日期更新每个字段。甚至可以作为一种安全层

    这是一个有点远的镜头,但当你处理数百个独特的领域;最终一定会变得有点难看

    希望能给你一点启发

  • 使用java.beans.PropertyChangeListener通知视图的更新。这里,PropertyChangeEvent传递源、propertyName、oldValue和newValue。如果您想要全新的类,请编写类似于PropertyChangeListener和PropertyChangeEvent的代码

  • 确保模型和视图遵循类似于JavaBeans命名约定的属性和访问方法的命名约定

  • 在视图的propertyChange()方法中,获取作为字符串可用的propertyName,根据命名约定确定视图方法(作为字符串),使用Java反射API通过将newValue作为参数传递来调用视图的相应方法

  • 使用java.beans.PropertyChangeListener通知视图的更新。这里,PropertyChangeEvent传递源、propertyName、oldValue和newValue。如果您想要全新的类,请编写类似于PropertyChangeListener和PropertyChangeEvent的代码

  • 确保模型和视图遵循类似于JavaBeans命名约定的属性和访问方法的命名约定

  • 在视图的propertyChange()方法中,获取作为字符串可用的propertyName,根据命名约定确定视图方法(作为字符串),使用Java反射API通过将newValue作为参数传递来调用视图的相应方法

  • 使用java.beans.PropertyChangeListener通知视图的更新。这里,PropertyChangeEvent传递源、propertyName、oldValue和newValue。如果您想要全新的类,请编写类似于PropertyChangeListener和PropertyChangeEvent的代码

  • 确保模型和视图遵循类似于JavaBeans命名约定的属性和访问方法的命名约定

  • 在视图的propertyChange()方法中,获取作为字符串可用的propertyName,根据命名约定确定视图方法(作为字符串),使用Java反射API调用corresp