我正在编写一个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,那么创建一个新的Presenter
和Model
原始内部会View
迫使我做很多工作,如果我想更改UI以使用JSF.
请随时添加评论以便澄清.
虽然拥有"嵌套"设计模式并不罕见,但在您的情况下并不是必需的.借鉴其他答案:
模型
- 包含所有实际数据,变量,对象
- 知道如何将其存储的数据值设置为新值
- 响应订单(方法调用)
- 具有方法setPreferences(value1,value2,value3 ...);
视图
- 是应用程序的IO,只是输出和输入
- 它只能在其自身,在其状态下工作
- 它维护局部变量和对象,例如.它有JButtons,JMenus,int counter ......
- 它知道如何通知Presenter状态变化
- 它的状态对于Presenter是可见的,或者是通过方法调用显示的
- 响应命令(方法调用)
- 知道如何获取来自用户的偏好
- 有方法askForPrefs();
- 有方法getPrefState();
演示者
- 响应状态变化
- 做所有决定,它告诉其他对象做什么(不是如何做)
- 知道何时需要偏好
- 知道在哪里获得新的偏好以及放置它们的位置
- 具有newPrefsAvailable方法( );
...从用户那里获得更多信息.在这些事件的情况下,我认为Swing视图适合生成一个新的JDialog窗口.
Presenter - 检查模型,确定需要新的首选项
Presenter - this.myView.askForPrefs(); //告诉视图询问用户pref值
View.askForPrefs - 弹出一个JDialog框,retVals存储在视图中作为状态更改
View - this.myPresenter.newPrefsAvailable();
Presenter - 使用this.myModel.setPreferences(this.myView.getPrefState())响应;
Model.setPreferences - 将存储的值更改为View.getPrefState()
Presenter - 检查模型 - 确定首选项是好的
Presenter - 继续
JDialog被视为View的一个扩展,它是View的成员,就像JButton一样.模型具有权威的实际首选项值,视图具有表示JDialog状态的局部变量.