适当的模型 - 视图 - 控制器设计

时间:2010-03-05 20:26:10

标签: java model-view-controller user-interface swing

我有一个Java项目,我正在尝试使用模型 - 视图 - 控制器设计。我拥有所有组成部分的骨干。我在决定如何将它们连接在一起时遇到了一些麻烦,尤其是视图和控制器。

我有一个名为 MainView 的类,它扩展了 JFrame 。我有各种其他类来帮助构成 MainView ,每个类都扩展了 JPanel 。例如,其中一个类称为 ParameterView 。我是否应该允许控制器查看每个“子视图”,或者我应该让控制器只看到 MainView 并通过那里管理所有内容?

与模型一样,模型应该通过一个总体类进行管理吗?

谢谢!

5 个答案:

答案 0 :(得分:6)

在GUI(类似Swing)应用程序的上下文中,模型 - 视图 - 控制器比具体设计更具有模糊的建议。这种“模式”的变种数量是惊人的,并且没有一个你应该瞄准的“适当”变体。您可以选择任何似乎支持您当前需求的变体(随着您的应用的发展随时更改它)。

那就是说,这里有一些关于你所描述的情况的指示

  • 您可以使用发布/订阅机制(AKA:观察者模式)或责任链模式来将模型(或其部分)与视图的不同部分分离。
  • 打包视图的所有部分的外观类(MainView)似乎是“上帝类”的配方:需要在应用程序中几乎任何更改(反模式)进行更改的类。通过公开视图的不同部分,您将能够更轻松地在新的上下文中重用它们。
  • 最后,通过子类化Swing组件来实现模型似乎不是一个好主意。这样的设计很难测试,这意味着它也非常坚硬。更喜欢委托而不是继承。或者正如JBrains所说:“停止继承,或小猫得到它”。使用继承只是为了覆盖Swing方法。立即将所有逻辑委托给与Swing完全隔离的对象。这将促进可测试性和未来的灵活性。

答案 1 :(得分:1)

使用福勒的Presentation Model概念我们取得了很好的成绩。我强烈建议任何正在进行UI开发的人阅读Fowler对此领域中尝试过的各种方法的报道(GUI Architectures) - 这是一本精彩的读物,并且对每种方法的挑战和成功提供了很好的见解

答案 2 :(得分:0)

最好在层之间建立最小的耦合,所以我可能会允许控制器只看到MainView。您还应该考虑定义MainView实现的接口,以使MVC结构更清晰。控制器不应该真的需要知道它正在处理JFrame。

答案 3 :(得分:0)

暂时忽略MVC,只将特定于Swing的代码放入您构建的扩展JComponent的任何视图组件中。将其他所有内容委托给您可以在不使用Swing的情况下编译的类。使用接口来帮助您。您的Controller应该能够在不知道它们来自Swing事件的情况下处理请求。您的模型应该能够在不参考Swing * Model类的情况下更新系统的状态。您的View应该能够描述如何在不引用JComponent类的情况下向用户显示结果。完成后,您可以轻松构建委派给模型,视图和控制器的JComponent对象。

我希望能帮助你。

答案 4 :(得分:0)

MVC通常是Observer(模型是可观察的),策略(不同的策略被交换到控制器以处理不同的视图)和Composite(视图是GUI组件的组合)。

为此,控制器应该观察模型并部署正确的策略来更新视图组合。您的MainView应该能够呈现从组件传递给它的复合项(JPanel?)。相反,控制器还应观察并响应来自UI的事件,并将其传递给适当的策略。

看看tikeSwing。对于Swing应用程序,这是一个简单的MVC框架,如here所述。