1

我即将将 Swing 应用程序从使用 ActionListeners 重构为 Action 类,因为我意识到我的许多菜单项也将在工具栏中使用。

现在我有一个类ImportExport,它处理底层模型的状态,然后显示适当的用户对话框。ImportExport具有 和的save()功能。当用户单击“打开”菜单项时,动作侦听器调用,首先检查模型是否有更改,如果是这种情况,则会显示一个对话框,询问用户是否要先保存。现在,如果用户单击“是”调用,它将再次执行一些检查并显示用户对话框。非常持久:退出此操作的唯一方法是成功保存或用户决定要取消。我强烈依赖提供的反馈,如果用户想取消,我也会取消呼叫saveAs()open()open()open()open()save()save()save()open()功能。

我想把这个ImportExport类分成三个类(OpenAction, SaveAction& SaveAsAction),每个类都是子类AbstractAction并最终摆脱了这个ImportExport类。SaveAction这就是我的问题出现的地方:如果用户想要在打开另一个模型之前保存模型,我如何告诉执行?如果用户决定取消,我如何获得反馈?

这甚至是正确的方法吗?我不喜欢在保存和打开操作中有重复的代码,我已经在我的底层模型中加入了尽可能多的功能,但是用户对话框显然不合适,所以这是没有选择的。完全被Action设计为拥有这种功能,或者我只是保留我的ImportExport类,并简单地将所有操作调用委托给ImportExport. 你怎么用Actions

4

2 回答 2

2

当涉及决策树时,我有时会添加“控制器”操作。OpenAction、SaveAction 和 SaveAsAction 将继承此控制器 Action。控制器操作将确定模型的状态,并在适当时向用户请求更多信息,然后调用正确的子类。

于 2010-02-05T09:32:14.330 回答
1

我会创建一个ImportExportController类,拥有这些方法:open, save, saveAs。这个控制器会知道业务逻辑。

我的Action课程不会包含很多业务逻辑。他们只会打电话给控制器。

但是这些操作将包含所有必须显示在 , 等中的标签、图标、JButton加速器JMenuItem...。

对我来说,Actions是面向 GUI 的类,用于方便(它们非常方便!),但没有专门用于处理业务逻辑的类。

于 2010-02-05T12:37:47.117 回答