我讨厌说些没什么想像力的东西,但是MVC可以工作-它不是最终的工具,但是它可以使您有条理。
编辑:在搜索一个半相关的主题时,我碰到了一个类似的想法,但会更详细。
就GWT而言,这意味着您应该考虑将GUI组件放在一个类中,将所有事件处理放在第二个类中,并将对象模型对象与其他两个对象分开。
实现此目的的一种方法是将GUI上的大多数或所有控件公开。这听起来有些la脚,但是它们的用法封装在控制器内部,所以这并不是您具有不可控制的访问权限-
实际上,与所有成员都是私有的相比,访问权限的定义更清晰/定义更好,但是您的视图代码与控制器结合在一起。
具体技巧:
让听众成为他们自己的班级。您经常可以重用它们-
换句话说,避免使用匿名内部类。我有时会创建一个侦听器类,并为每个按钮/控件实例化一个新实例,这些按钮/控件在按下时需要具有相似的效果。如果我需要它对给定的按钮采取一些稍有不同的操作,则将某些内容传递给“特殊”处理程序的构造函数,以便他们知道某些不同的操作。如果需要,您还可以创建不同的处理程序子类-
我只是说不要忘记事件处理程序是类,可以使用继承,并且在需要时可以使用所有内容。
我很久以前学过的一个非常古老的GUI技巧,不要让各种微型处理程序以不同的方式修改GUI,而是让所有“活动”按钮和控件在GUI中设置状态,然后调用一个方法来将该状态应用于GUI上的所有控件。当您超越普通的GUI时,这可能会节省生命。如果不清楚,请发表评论,并为您提供示例。
属性表:
GUI有一个特例-
属性表样式GUI。我已经做了很多这些,它们使人为地狱而烦恼。它们往往具有数十或数百个控件,每个GUI控件往往都绑定到模型中的特定字段,并且只有几百行复制和粘贴样板代码连接它们,每组都复制并粘贴了几行项目已更改-
每个控件至少需要3行代码(创建控件,复制值输入和复制值输出)。
我总是使用“智能”控制器编写这些代码,该控制器可以智能地将控件绑定到某些数据,而无需任何唯一代码。这可能会很棘手,如果这是您的问题,请在评论中让我知道,我可以为您提供一些可能会尝试的技巧的一般建议。我已经从最小的反射解决方案变成了基于XML的完整解决方案。如果我要再做一次,我可能会考虑基于注释。
MVC的示例:
注意,这只是一个示例,有数百万种方法可以执行MVC。
在您的MAIN中:
- 实例化MyView
- 实例化MyModel
- 实例化MyController(myView,myModel)
- myView.setVisible(true)
在我看来
- 可能会扩展框架
- 大多数组件都是public final(public final Button b = new Button())
- 如果公共成员使您感到紧张,请使用吸气剂-与公共最终成员具有完全相同的效果,只需要一点额外的语法。
- 请记住,您可以在构造函数中设置最终成员。
- 可能具有诸如reset()之类的常规方法,但是MyController可能是一个更好的选择。
在MyController中
- 保存对myView和myModel的引用
- 在必要时将侦听器添加到myView中(请参阅上面有关侦听器的建议)
- 根据myModel的状态配置myView
- 当按下“完成”按钮时,将状态从myView复制到myModel
- 通知myModel数据已更新并自行销毁。
在MyModel中:
这将是一个典型的模型类,它将包含您的业务逻辑(通常不用作GUI的一部分,这更像是MyController中的GUI逻辑。控制器倾向于在您的业务逻辑中设置值,然后调用诸如update(
),以使某些业务逻辑获得控制。它不应该知道GUI,这是您的“纯”业务类。
有时,GUI可能会调用update()或其他方法来触发一些数据更改,然后从模型中重新加载GUI控件-
这是一种在您的模型不了解GUI的情况下将业务逻辑与GUI集成的相当不错的方法…
而且,正如我上面所说的,如果我使用属性表,我会在MyController中投入更多的工作,这是因为如果您不聪明,那么最终会得到大量的样板行。
请注意,View和Controller几乎总是配对。您不能只用Web视图替换Swing视图并期望控制器保持不受干扰-
但是对于视图或控制器,模型永远都不应更改。



