我正在开发一个 MVC Java Swing 应用程序,它将为用户提供至少十几种不同的操作。其中一些操作将触发SwingWorker
对象的执行,而其他操作则非常简单(或常见)。我开始讨论here所讨论的方法,但我对其进行了修改,以避免为任何“常见”操作定义AbstractAction
类的实现。这是我实施的解决方案:
操作枚举类定义了我的“常见”操作:
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;
}
所以我得到了如下所示的动作(在Controller中)并将它们分配给目标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);
...
其中ComplexAction
是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对象通过编写 less code 来实现相同的结果?我觉得这是一个非常常见的模式,对我来说似乎很奇怪,使用AbstractAction
实现MVC模式没有更好的方法。