在 MVC 模型中实现 AbstractAction [关闭]

Posted

技术标签:

【中文标题】在 MVC 模型中实现 AbstractAction [关闭]【英文标题】:Implementation of AbstractAction in the MVC model [closed] 【发布时间】:2016-02-18 10:46:31 【问题描述】:

我正在开发一个 MVC Java Swing 应用程序,它将为用户提供至少十几种不同的操作。其中一些操作将触发SwingWorker 对象的执行,而其他操作则非常简单(或常见)。我从here 讨论的方法开始,但我对其进行了修改,以避免为任何“常见”操作定义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);
    ...

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

最后,Model中的“通用”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 来实现 MVC 模式。

【问题讨论】:

您可以通过一种 EventBus 来概括事件,您可以在其中通过 String 注册事件,然后通过 String 和 EventObject(ActionEvent 的超类)触发事件。您的动作侦听器仅使用唯一的事件名称标识符触发 EventBus,所有侦听器都将收到通知。它允许您断开实际的事件生成器以及操作需要发生的位置。 根据更新投票重新开放,但问题仍然很广泛;另见Examples of GoF Design Patterns in Java's core libraries 【参考方案1】:

创建一个包含 Action 实现的抽象类。确切的公式取决于您的域,但EditorKit 可以作为示例。正如here 建议的那样,具体的编辑器工具包“导出有用的Action 类,这些类在文本组件通用的Document 模型上运行。”更多讨论可以在here、here和here找到。

【讨论】:

回复update 2,DefaultEditorKit.CopyAction 显示为here。

以上是关于在 MVC 模型中实现 AbstractAction [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

在 ASP.NET MVC 2 中实现 DropDownList 的最佳方式?

如何在 ASP.NET MVC 5 中实现自定义身份验证

如何在 jquery 中实现 MVC [关闭]

在 Iphone 中实现 MVC

如何在 Tkinter 中实现 MVC 模式

如何在 MVC 4/Web Api 2 中实现不记名令牌认证