在运行时添加监听器? - Java MVC

时间:2010-03-16 09:56:32

标签: java model-view-controller observer-pattern listeners

我的模型在我的MVC模式中,在运行时生成组件并通过update()方法将它们提供给要在屏幕上显示的视图(您知道,模型是可观察的,视图是观察者)。但我还需要为这些组件添加侦听器,并且控制器具有侦听器方法(因为他们说MVC模式是这样的)并且它不参与此更新过程。所以我不能在运行时添加监听器,而只能在启动时在控制器的构造函数中添加。

我有一个想法,就是让控制器成为观察者,然后将数据提供给视图,以及添加监听器。你认为这样会好吗?

3 个答案:

答案 0 :(得分:3)

我认为你可能会遇到一些电线。

  1. 该模型是可观察的(检查!)
  2. 视图正在观察模型(检查!)
  3. 控制器绑定到视图(TODO!)
  4. #3表示来自视图的用户交互应该调用控制器类中的已注册侦听器,然后更新模型状态。

    这是'经典'Swing MVC。 alt text http://java.sun.com/developer/technicalArticles/javase/mvc/images/Figure1.gif

    '修改'的Swing MVC(在这个问题的其他答案中推荐),让控制器扮演Mediator的角色。

    在此设计中,当用户执行操作时,视图会在控制器上调用适当的方法。然后,控制器访问模型(可能更新它)。最后,如果模型被更改,它会通知感兴趣的听众(在这种情况下,控制器)。

    这是一个“修改过的”MVC。 alt text http://java.sun.com/developer/technicalArticles/javase/mvc/images/Figure4.gif

    第二种设计('修改'MVC)允许非常明显地解耦模型和视图。

    有关更多信息,请查看this article有关Java Swing MVC的信息。太棒了。

答案 1 :(得分:2)

是的,让控制器成为你的模型观察者以允许它更新视图,在我看来,它肯定适合MVC正统。

答案 2 :(得分:2)

例如,在swing中,控制器/动作监听器是视图的观察者(按钮等)和调用按钮(即,当视图改变时)控制器启动并与模型交互并再次更新视图(使用new模型变化)

所以你最后建议对我有意义:))