用Java纠正MVC实现

时间:2011-02-25 01:22:32

标签: java model-view-controller design-patterns

我仍在尝试了解实现MVC的正确方法。此示例@oracle表示该视图可以访问控制器。另一个教程@leepoint表明该视图可以访问模型。这些是MVC的不同变体吗?在我的情况下,我在Oracle网站上进行了一些修改(我在AbstractController getModelProperty中添加了一个函数,这将允许我检索当前注册模型的字段的值,但我也可以感觉到它通过了模型作为参数(如leepoint教程中所示),以简化并可能优化视图的数据访问。

提前致谢。

5 个答案:

答案 0 :(得分:2)

视图与模型绑定。由于视图渲染模型,他们必须对模型有深入的了解,因此根本无法解决。有些视图是通用的,它们具有“通用”模型。在这里,您可以尝试将实际模型与通用模型相符合,以便“通用”视图可以使用您的数据。但即使使用这些通用模型,视图仍然与它们紧密相关。

模型管理数据,状态。虽然视图对模型有深入了解,但模型与视图无关。它根本不在乎。这样,您可以为同一模型创建多个视图。

但是,模型必须告知其他人模型的更改。通常在java中使用PropertyChangeListener。这种机制让模型只是大肆宣传变化,任何有兴趣的人都可以倾听这些变化并采取行动,例如你的观点。

一个简单的例子是你的游戏对象可以从子弹中受到伤害,并且它会降低到50%以下的生命值。该视图可以看到健康状况已经降低并改变了模型的图像(比如添加烟雾等)。

Controller通常与视图和模型紧密绑定。它知道视图的功能(如它的大小和其他感兴趣的领域),并且知道如何更改模型。例如,当单击鼠标时,控制器将鼠标指针转换为相对于视图的坐标,并从中确定单击了哪个对象。确定单击的对象后,可以将对象的模型设置为“选中”。

然后模型广播说它的“已选择”属性已经改变。视图看到这一点,找到更改的模型的边界矩形,并使其显示的矩形无效。

最后,Java出现并告诉视图“嘿,Rect 10,10,100,100需要绘制”。视图在该rect中找到模型,用“选定”边框或其他任何东西绘制对象的新视图。

这就是整个周期的运作方式。

答案 1 :(得分:0)

两者都是。 MVC彼此之间具有三角关系,控制器位于顶部。最新的方法是使用MVP,其中Presenter位于模型和视图之间。

如果你能够从视图中保留尽可能多的模型知识并且只提供特定于其查看任务的信息,那就更好了。从长远来看,它确实让你的生活更轻松。

答案 2 :(得分:0)

  

...说该视图可以访问控制器。

是的,该视图包含对用户手势的控制器的引用。 (在gui中,视图和控制器有时会最终混在一起)。

  

......视图可以访问模型。

是的,视图通常包含对模型的引用(它可能有多个)。

  

......这些MVC的不同变体是什么?

有很多变化。

  

...但我也可以将模型作为参数传递(如leepoint教程所示)...

通常模型具有观察者的视图,并且视图在接收到更新消息时自动更新,而不是由控制器直接调用。前者将视图与控制器分离得更多。

答案 3 :(得分:0)

Swing库是MVC模式的一个非常好的实现。只需研究一下API,它就会全部适合你。

答案 4 :(得分:0)

Wikipedia Article on MVC很好地建立了关系:View有Model,Controller有View和Model,Model对View和Controller都一无所知。

在某些情况下,通过组合View和Controller来简化模式可能是有利的。