我正在开发一个MVC Java Swing应用程序,它将为用户提供至少十几种不同的操作。其中一些操作将触发SwingWorker
对象的执行,而其他操作则非常简单(或常见)。我从这里讨论的方法开始,但为了避免AbstractAction
为任何“常见”操作定义类的实现,我对其进行了修改。这是我实施的解决方案:
Action枚举类定义了我的“常见”操作:
public enum Action {
// label mnemonic modelObject modelMethod
EXIT ("Exit" , KeyEvent.VK_E , "SubModel", "openExitView")
,FLAG_1 ("Flag 1" , KeyEvent.VK_1 , "Options", "setFlag_1")
,FLAG_2 ("Flag 2" , KeyEvent.VK_2 , "Options", "setFlag_2")
,HELP ("Help" , KeyEvent.VK_L , "SubModel", "openHelpView")
,ABOUT ("About" , KeyEvent.VK_A , "SubModel", "openAboutView");
然后,在Controller类中,我添加了这个方法:
public AbstractAction getAction(final Action action) {
AbstractAction actionImpl = new AbstractAction(action.label) {
{
putValue(AbstractAction.MNEMONIC_KEY, action.mnemonic);
}
public void actionPerformed(ActionEvent e) {
model.executeAction(action);
}
};
return actionImpl;
}
所以我得到如下的动作(在控制器中)并将它们分配给目标 Swing 组件:
private AbstractAction exitAction = getAction(Action.EXIT);
private AbstractAction flag_1Action = getAction(Action.FLAG_1);
private AbstractAction flag_2Action = getAction(Action.FLAG_2);
private AbstractAction helpAction = getAction(Action.HELP);
private AbstractAction aboutAction = getAction(Action.ABOUT);
private AbstractAction complexAction = new ComplexAction("Complex");
...
view.setExitAction(exitAction);
view.setAboutAction(aboutAction);
view.setHelpAction(helpAction);
...
whereComplexAction
是 的完整实现AbstractAction
,这只是枚举类中未列出的操作的管理示例(因为它不是“常见”操作),但值得自定义完整实现。
最后,模型中的“通用”executeAction
方法负责将动作分派给特定的子模型类:
public void executeAction(Action action) {
Object obj = getModelInstance(action.modelObject);
if (obj == null) return;
Method method = null;
try {
method = obj.getClass().getMethod(action.modelMethod);
...
在getModelInstance
给定枚举中列出的模型类名的情况下,只需从模型工厂检索目标子模型对象的实例。
一切正常,但我不相信这种模式:这不是样板代码吗?是否有一些 J2EE 对象通过编写更少的代码来实现相同的结果?我觉得这是一个非常常见的模式,我觉得奇怪的是没有更好的方法来使用AbstractAction
.