我正在编写一个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
窗口。
一种思路让我觉得这可能是orignal Presenter
中适当的代码:
public void handlePreferences() {
Preferences prefs = view.getPreferences();
model.setPreferences(prefs);
}
也就是说,每个JDialog
的内容应代表一个独特的对象,应该从View
检索并在Model
中更新。但是,这就留下了一个问题:我是否创建了一个新的Model
来表示Preferences
对象,并为Presenter
中的事件处理创建一个新的JDialog
?
在我看来,在原始Presenter
内部创建一个新的Model
和View
会迫使我做很多工作,如果我想改变那就很难移植例如,使用JSF的UI。
请随时添加评论以便澄清。
答案 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级。 Swing应用程序的“模型”实际上可以是单独的“模型”类的“树” 有一个共同的“根”。
所以在你的情况下你需要
“全球”模型 - &gt;(包含)“偏好设置”模型。