MVC视图和控制器通信的实现。 (JAVA)

时间:2011-03-08 18:19:10

标签: java model-view-controller view controller communication

在我的班上,我们一直在学习不同的设计,如MVC和MVP。我目前正在编写一个在JTable和自定义绘图中显示数据的应用程序。我的问题是我应该如何在视图和控制器之间进行通信。

作为一个例子,我有一个按钮,可以将文件中的数据导入模型。我想我想要的是用于通知控制器用户想要导入文件的视图。然后控制器执行必要的逻辑。这个观点应该怎么做?我看到了几个选择。 1)让控制器创建一个内部类,只要用户点击导入按钮就会调用该内部类。在这种情况下,控制器必须调用视图的方法以查看用户想要导入的文件。 2)让视图检测到事件,然后在控制器中调用适当的方法并传递文件名。

这引出了一个更大的问题,即视图是否知道控制器?我知道这些东西没有正确的答案,但最好的方法是什么?

3 个答案:

答案 0 :(得分:2)

您可能知道,Controller层大部分时间都与View层紧密耦合。

在我作为架构师或程序员参与的项目中,我从未将业务逻辑放在控制器中。因为我从未见过任何可以移植直接与视图通信的层的技术。

控制器层应充当视图的服务层。是的视图必须知道控制器。并且,如果前面的陈述是真的,那么控制器可以与视图进行通信没有问题。

我在一个完全基于POJO的图层中设计我的业务逻辑(我的@EJB或spring的@Service)。这是我的便携式业务层。

控制器只是视图和业务规则层之间的桥梁。它调用业务方法,正确地(有时)格式化它们的响应并发送回视图。在这种情况下,控制器可以是Web服务,托管bean,测试套件等......

答案 1 :(得分:0)

视图必须知道控制器的方式。根据我的经验,GUI生成的事件(例如按钮点击,拖放等)最好在视图中处理,因为它们特定于您正在使用的视图类型(如果您的视图类型有很大差异)例如,UI是基于语音的。控制器应该公开像

这样的API
importFile(String filePath)

使用1)方法,只要在视图中添加新视图/更改内容,就必须修改控制器。 2)方法更好。

答案 2 :(得分:0)

我通常将视图作为 Controller Listeners 。通过这种方式,我可以拥有相同控制器的几个不同的视图。所有视图都应该实现一些通用接口。我使用构造函数注入提供从 View Controller 的访问。所以它可以像这样

InterfaceWithMethodThatViewCanCall controller = new ConcreteController(new Model);
SomeView view = new ConcreteSomeView(controller);
controller.addListener(view);

我目前尝试使用的另一种方式是通信抛出EventBus。我建议你锁定 GWT 哪些MVP用法示例。

*遗憾的是,我还没有读过关于这个主题的任何好的研究出版物。