【问题标题】:Applying the MVP pattern to JDialogs将 MVP 模式应用于 JDialogs
【发布时间】:2010-10-05 21:43:25
【问题描述】:

我正在编写一个 Swing 应用程序,除了 my previous question,我决定使用 Model-View-Presenter 模式将用户界面与业务逻辑分开。

当我的应用程序启动时,它会执行以下代码:

Model model = new BasicModel();
Presenter presenter = new Presenter(model);
View view = new SwingView(presenter);
presenter.setView(view);

presenter.init();

创建用户界面。事件由View 生成,并委托给Presenter。然后Presenter 操作Model 并相应地更新View

为了处理一些事件,我需要从用户那里获取更多信息。对于这些事件,我认为 Swing 视图生成一个新的JDialog 窗口是合适的。

一个思路让我觉得这可能是原始Presenter中的合适代码:

public void handlePreferences() {
    Preferences prefs = view.getPreferences();
    model.setPreferences(prefs);
}

也就是说,每个JDialog 的内容应该代表一个不同的对象,该对象应该从View 中检索并在Model 中更新。然而,这留下了一个问题:我是否创建一个新的Model 来表示Preferences 对象和一个新的Presenter 用于在该JDialog 中处理事件?

在我看来,在原来的 View 内部创建一个新的 PresenterModel 会迫使我做很多工作,如果我想更改 UI 以使用 JSF,这些工作将更难移植,例如。

请随时添加 cmets 以进行澄清。

【问题讨论】:

    标签: java swing design-patterns mvp


    【解决方案1】:

    虽然“嵌套”设计模式并不少见,但在您的情况下并不是必需的。借鉴其他答案:

    型号
    - 包含所有真实数据、变量、对象
    - 知道如何将其存储的数据值设置为新值
    - 响应命令(方法调用)
    - 有方法 setPreferences(value1,value2,value3...);

    查看
    - 是应用程序的 IO,只是输出和输入
    - 它只能在自己的状态下工作
    - 它维护局部变量和对象,例如。它有 JButtons、JMenus、int 计数器 ...
    - 它知道如何通知状态变化的演示者
    - 其状态对 Presenter 可见,或通过方法调用显示
    - 响应命令(方法调用)
    - 知道如何从用户那里获得偏好
    - 有方法 askForPrefs();
    - 有方法 getPrefState();

    演示者
    - 响应状态变化
    - 做所有决定,它告诉其他对象做什么(而不是如何做)
    - 知道何时需要偏好
    - 知道从哪里获得新的偏好以及将它们放在哪里
    - 有方法 newPrefsAvailable();

    ... 从用户那里获取更多信息。对于这些事件,我认为 Swing 视图生成一个新的 JDialog 窗口是合适的。

    Presenter - 检查模型,确定需要新的首选项
    演示者 - this.myView.askForPrefs(); //告诉视图向用户询问首选项值
    View.askForPrefs - 弹出一个 JDialog 框,将 retVals 作为状态变化存储在视图中
    查看 - this.myPresenter.newPrefsAvailable();
    演示者 - 以 this.myModel.setPreferences (this.myView.getPrefState()) 响应;
    Model.setPreferences - 将存储的值更改为 View.getPrefState()
    演示者 - 检查模型 - 确定偏好是否良好
    演示者 - 继续

    JDialog 被视为只是 View 的扩展,它是 View 的成员,就像 JButton 一样。 模型有权威的实际偏好值,视图有代表JDialog状态的局部变量。

    【讨论】:

    • “JDialog 被视为只是 View 的扩展,它是 View 的成员,就像 JButton 一样” - 这说明了一切。谢谢。
    • 干杯,我可以变得相当冗长:)
    【解决方案2】:

    我的建议是从根本上考虑这些“偏好”是什么。它们是底层业务逻辑的一部分吗?如果是这样,那么它们应该是模型结构的一部分。他们是否指定了用户与业务数据交互的首选方式?那么它们应该是视图的一部分。这似乎是理论上的,但根据我的经验,它最终会省去很多麻烦。

    如果您无法解决这个问题,那么保存首选项的位置会为您提供另一条线索。如果它们需要与被操作的数据一起保存,那么它们可能是业务逻辑的一部分。如果它们保存在用户的个人偏好文件中,那么它们不是,应该被视为视图。

    【讨论】:

      【解决方案3】:

      不,你不需要另一个“模型”只是为了偏好

      只需将演示者和模式作为参数传递给 JDialog 的构造函数。 如果有,编写大型 Swing 应用程序会更容易

      • 1 个模型
      • 1 个控制器(它本身可能包含更小的控制器)
      • 多个视图(但在相同的数据/模型类上)

      请注意,1 个模型!= 1 个类。 Swing 应用程序的“模型”实际上可以是单独的“模型”类的“树” 有一个共同的“根”。

      所以你需要

      “全局”模型 ->(包含)“首选项”模型。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-04
        • 1970-01-01
        • 2017-10-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多