Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 有数据行的MVC?_Java_Model View Controller - Fatal编程技术网

Java 有数据行的MVC?

Java 有数据行的MVC?,java,model-view-controller,Java,Model View Controller,我有一个非MVC Java应用程序,我正在将其重构为MVC,以便于将来的维护。AppGUI包含任意数量的行,每个行由包含多个控件的JPanel表示。我已经将每行的逻辑重构为一个模型类,并按照。我不想粘贴整个代码的MVC框架,但本质上它假设每个类只有一个视图和一个模型,并且每个模型都有唯一的方法名。只要只有一个模型和一个控制器,一切正常 问题:我现在有n个行视图和n个行模型,都添加到控制器中。更新行视图中的任何文本字段时,所有行模型都会更新。我可以看到修改控制器以存储一对哈希映射视图到模型,反之亦

我有一个非MVC Java应用程序,我正在将其重构为MVC,以便于将来的维护。AppGUI包含任意数量的行,每个行由包含多个控件的JPanel表示。我已经将每行的逻辑重构为一个模型类,并按照。我不想粘贴整个代码的MVC框架,但本质上它假设每个类只有一个视图和一个模型,并且每个模型都有唯一的方法名。只要只有一个模型和一个控制器,一切正常


问题:我现在有n个行视图和n个行模型,都添加到控制器中。更新行视图中的任何文本字段时,所有行模型都会更新。我可以看到修改控制器以存储一对哈希映射视图到模型,反之亦然,但这似乎违反了精简控制器的原则。我觉得我错过了一些显而易见的东西,设计模式和策略。解决这个问题有什么想法吗?

您的控制器应该有一个数据存储(数据库或一些基于内存的映射),其中每个模型都有一个唯一的标识符索引。然后,当您将模型加载到控制器中进行修改时,您只需要修改“当前”模型实例

当您一次显示多个模型时,听起来您需要一个“部分视图”——实际的“视图”将显示单个模型视图部分的表或列表,这些部分可以包含在循环中,例如(非常简化的)示例:

//查看
List modelsToDisplay=controller.someFunctionToLoadModels();
用于(型号m:modelsToDisplay){
addModelToView(m);
}
...
公共void addModelToView(模型m){
ViewPartial vp=生成视图部分模型(m);
this.viewPartials.add(vp);
}
...
公共视图部分生成视图部分模型(m型){
ViewPartial vp=新ViewPartial();
vp.setLabel(m.getName());
vp.setTextValue(m.getValue());
返回vp;
}

我的同事指出,模型通常负责数据存储,而控制器只是进行转换以向视图提供适当的模型。
// View
List<Model> modelsToDisplay = controller.someFunctionToLoadModels();
for (Model m : modelsToDisplay) {
    addModelToView(m);
}

...

public void addModelToView(Model m) {
    ViewPartial vp = generateViewPartialForModel(m);
    this.viewPartials.add(vp);
}

...

public ViewPartial generateViewPartialForModel(Model m) {
    ViewPartial vp = new ViewPartial();
    vp.setLabel(m.getName());
    vp.setTextValue(m.getValue());
    return vp;
}