将MVP模式应用于JDialogs

我正在编写一个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窗口。

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

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

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

在我看来,如果我想更改UI以使用JSF,那么在原始View中创建一个新的PresenterModel迫使我做很多工作,如果我想更改UI以使用JSF。

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

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

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

视图
– 是应用程序的IO,只是输出和输入
– 它只能在自己的状态下工作
– 它维护局部变量和对象,例如。 它有JButtons,JMenus,int counter ……
– 它知道如何通知状态变化的演示者
– 其状态对于Presenter可见,或通过方法调用显示
– 响应订单(方法调用)
– 知道如何从用户那里获得偏好
– 有方法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()
Presenter – 检查模型 – 确定首选项是好的
演讲者 – 继续

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

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

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

不,你不需要为首选项提供另一个“模型”

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

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

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

所以在你需要的情况下

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