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