将MVP模式应用于JDialogs

3
我正在编写一个Swing应用程序,根据我的之前的问题,我决定使用模型-视图-控制器模式来将用户界面与业务逻辑分离。
当我的应用程序启动时,它会执行以下代码:
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内部创建一个新的Presenter和Model会强制我做很多工作,如果我想要更改UI以使用JSF,那么这将更难移植。
请随时添加评论以进行澄清。
3个回答

8
尽管“嵌套”设计模式并不罕见,但在您的情况下并不必要。参考其他答案: 模型 - 包含所有实际数据、变量和对象 - 知道如何将存储的数据值设置为新值 - 响应命令(方法调用) - 有方法setPreferences(value1,value2,value3...); 视图 - 是应用程序的 IO,只有输出和输入 - 它只能在自身上工作,在其状态上工作 - 维护本地变量和对象,例如它有JButtons、JMenus、int计数器... - 它知道如何通知Presenter状态改变 - 它的状态对Presenter可见,或通过方法调用揭示 - 响应命令(方法调用) - 知道如何从用户那里获取首选项 - 有方法askForPrefs(); - 有方法getPrefState(); Presenter - 响应状态变化 - 做出所有决定,告诉其他对象该做什么(而不是如何做) - 知道何时需要首选项 - 知道在哪里获取新的首选项和放置它们 - 有方法newPrefsAvailable();
引用: ...从用户那里获取更多信息。在这些事件的情况下,我认为Swing视图生成一个新的JDialog窗口是合适的。
Presenter - 检查Model,确定需要新的首选项 Presenter - this.myView.askForPrefs(); //告诉视图询问用户首选项值 View.askForPrefs - 弹出一个JDialog框,将retVals存储在视图中作为状态更改 View - this.myPresenter.newPrefsAvailable(); Presenter - 用this.myModel.setPreferences (this.myView.getPrefState())回应; Model.setPreferences - 将存储的值更改为View.getPrefState() Presenter - 检查Model-确定首选项是好的 Presenter - 继续
JDialog被视为视图的扩展,它就像JButton一样是视图的成员。 模型具有权威的实际首选项值,而视图具有表示JDialog状态的本地变量。

JDialog被视为View的扩展,它就像JButton一样是View的成员。这就是全部内容。谢谢。 - David Grant
谢谢,我可能会变得非常啰嗦 :) - Paxic

1

我的建议是要考虑这些“偏好”本质上是什么。它们是基础业务逻辑的一部分吗?如果是,那么它们应该是模型结构的一部分。它们是指定用户与业务数据交互的首选方式吗?那么它们应该是视图的一部分。这可能看起来很理论化,但根据我的经验,最终可以节省很多麻烦。

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


1

不需要为偏好设置再创建另一个“模型”

只需在JDialog的构造函数中将Presenter和Mode作为参数传递即可。 当有

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

编写大型Swing应用程序时,这样会更容易。

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

因此,在您的情况下,您需要

“全局”模型 ->(包含)“偏好设置”模型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接