3

我正在编写一个 Swing 应用程序,对于我之前的问题,我决定使用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

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

请随时添加评论以进行澄清。

4

3 回答 3

8

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

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

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

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

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

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

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

于 2009-02-13T11:34:03.980 回答
1

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

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

于 2009-02-06T16:23:34.507 回答
1

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

只需在 JDialog 的构造函数中将演示者和模式作为参数传递。编写大型 Swing 应用程序时更容易

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

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

所以在你的情况下你需要

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

于 2009-02-10T21:47:45.280 回答