我正在用 Java 开发一个应用程序,并且我正在使用 Swing 作为 GUI。我打算使用 Martin Fowler 在这里介绍的演示模型模式:http ://martinfowler.com/eaaDev/PresentationModel.html
但我真的不喜欢在我的 Presentation Model 类中处理 View ,所以我发现我可以用不同的方式来做。
在我的方法中,我将有一个 CustomViewModel 类扩展 Swing 组件模型(如 JTable 的 TableModel 或 JButton 的 ButtonModel)。此类将覆盖用户更新模型数据时执行的方法。所以我会做我的工作,比如更新 DomainModel 然后调用 parents 方法。这样,我将始终在 DomainModel 和 ViewModel 之间保持数据同步。
例如:
class MyCustomJTableModel extends TableModel{
... overriding required methods for synchronization
}
在设置 gui 功能中,我将拥有:
JTable table = new JTable();
MyCustomJTableModel model = new MyCustomJTableModel();
model.setDataSource( Database.getDB().getModelFor( "model.name" ) );
table.setModel( model )
View view = new View();
view.addComponent( "JTableModel", model );
ResourceHandler rH = new ResourceHandler();
rH.add( model );
所以现在在我的控制器功能中,我可以拥有:
public class FileOpenCOntroller{
public void perform(ResourceHandler rH){
MyCustomTableModel model = rH.getModel("JTableModel");
model.loadDataFromDataSource( "File.xml" );
}
}
就是这样,MyCustomTableModel 已经覆盖了 JTable 用来更新其内容的方法,并且在实际调用父母 setModel 之前让我的代码更新实际模型。无需查看参考。问题是当我需要处理与其他组件没有相似关系的 JFileChooser 时。我说的是一些 ViewModel 类。
有谁知道如何解决这种方法。
我想要实现的不是在 MyCustomComponentModel 和 Controller 中都引用 View。我想通过一组CustomComponentModel在控制器和视图之间进行通信,它扩展了TableModel、ButtonModel等视图模型。这样做的目的是更容易TDD。在这种方法中,仅未测试事物的布局。