将MVP模式应用于JDialogs

时间:2009-02-06 09:52:03

标签: java swing design-patterns mvp

我正在编写一个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生成,并委托给PresenterPresenter然后操纵Model并相应地更新View

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

一种思路让我觉得这可能是orignal Presenter中适当的代码:

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

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

在我看来,在原始Presenter内部创建一个新的ModelView会迫使我做很多工作,如果我想改变那就很难移植例如,使用JSF的UI。

请随时添加评论以便澄清。

3 个答案:

答案 0 :(得分:8)

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

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

查看
- 是应用程序的IO,只是输出和输入
- 它只能在自己的状态下工作 - 它维护局部变量和对象,例如。它有JButtons,JMenus,int柜台......
- 它知道如何通知状态变更的主持人
- 其状态对于演示者可见,或通过方法调用
显示 - 响应订单(方法调用)
- 知道如何从用户获得偏好 - 有方法askForPrefs();
- 有方法getPrefState();

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

  

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

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

JDialog被视为View的一个扩展,它是View的成员,就像JButton一样。 模型具有权威的实际首选项值,视图具有表示JDialog状态的局部变量。

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

不,您不需要仅为首选项

使用其他“模型”

只需将演示者和模式作为参数传递给JDialog的构造函数。 当存在

时,更容易编写大型Swing应用程序
  • 1型号
  • 1个控制器(本身可能包含较小的控制器)
  • 多个视图(但在SAME数据/模型类上)

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

所以在你的情况下你需要

“全球”模型 - &gt;(包含)“偏好设置”模型。