我即将重构一个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
?
答案 0 :(得分:2)
当涉及决策树时,我有时会添加“控制器”操作。 OpenAction,SaveAction和SaveAsAction将子类化此控制器Action。控制器操作将确定模型的状态,并在适当时从用户请求更多信息,然后调用正确的子类。
答案 1 :(得分:1)
我会创建一个ImportExportController
类,使用以下方法:open, save, saveAs
。该控制器将了解业务逻辑。
我的Action
类不会包含很多业务逻辑。他们只会打电话给控制器。
但这些操作将包含必须显示在JButton
,JMenuItem
等所有标签,图标,加速器......
对我来说,Actions
是面向GUI的类,为方便起见(它们非常方便!),但没有专用于处理业务逻辑的类。