【问题标题】:Adding Listeners at runtime? - Java MVC在运行时添加监听器? -Java MVC
【发布时间】:2011-01-28 01:00:16
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    我认为你可能有一些电线交叉。

    1. 模型是可观察的(检查!)
    2. 视图正在观察模型(检查!)
    3. 控制器绑定到视图(TODO!)

    #3 表示来自视图的用户交互应该调用控制器类中注册的侦听器,然后更新模型状态。

    这是“经典”的 Swing MVC。
    (来源:sun.com

    “修改后的”Swing MVC(此问题的其他一些答案推荐)让控制器扮演中介者的角色。

    在此设计中,当用户执行操作时,视图会在控制器上调用适当的方法。然后,控制器访问模型(可能会更新它)。最后,如果模型发生变化,它会通知感兴趣的侦听器(在本例中为控制器)。

    这是一个“修改过的”MVC。
    (来源:sun.com

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

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

    【讨论】:

    • 碰巧我遇到了一个将控制器放在中心,并将模型和视图绑定到它的教程。我遵循了那个例子。这不也可以完成这项工作,只是将某些角色切换到控制器?如果可能的话,我想继续使用这种方法,如果它没有设置严重的限制或某事。请? :)
    • 实际上这个修改后的视图是有意义的,将监听器方法保留在视图中似乎是一种更简洁的方式。但是为什么大家都说视图只显示数据而控制器真正与用户输入交互呢?
    • 有不同的动作被触发:视图通知控制器GUI中的动作,模型通知视图变化。在“修改”的 MVC 中,模型通知控制器,然后控制器通知视图。
    • 视图确实只是显示数据。但它必须以某种方式通知控制器——通常是通过直接方法调用。
    • 我在看这个教程,很好,但是这个中的控制器对我来说似乎是一个非常不重​​要的工具,它没有什么特别的,不是吗?我的意思是,我们也可以移除控制器并直接在模型和视图之间工作,并且实现不会有太大变化,不是吗?
    【解决方案2】:

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

    所以你最后的建议对我来说确实有意义:)

    【讨论】:

    • 2 已经足够好了 :) 谢谢,我要给你们点赞,也许你们可以考虑给我点个赞,这是一种互惠互利的事情 :)
    【解决方案3】:

    是的,让控制器成为模型观察者以允许它更新视图在我看来完全符合 MVC 正统观念。

    【讨论】:

    • 还有其他想法吗?有人反对吗?顺便说一句,谢谢ridui。
    • 可能对以下链接感兴趣:emilmont.net/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-03
    • 2013-04-24
    • 1970-01-01
    • 2013-07-20
    • 2018-08-30
    • 2020-06-13
    • 1970-01-01
    相关资源
    最近更新 更多