在MVC模型中实现AbstractAction

时间:2016-02-18 10:46:31

标签: java swing model-view-controller abstract-action

我正在开发一个 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);
    ...

其中ComplexActionAbstractAction的完整实现,这只是管理枚举类中未列出的操作的一个示例(因为它不是“常见”操作),而是值得的自定义完整实施。

最后,模型中的“通用”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模式没有更好的方法。

1 个答案:

答案 0 :(得分:1)

创建一个包含 Action实现的抽象类。确切的配方取决于您的域名,但EditorKit可以作为示例。正如建议here,具体的编辑工具包"导出有用的Action类,这些类在文本组件共有的Document模型上运行。"可以找到更多讨论hereherehere