在 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);
...
其中ComplexAction
是AbstractAction
的完整实现,这只是枚举类中未列出的操作的管理示例(因为它不是“常见”操作),但值得自定义完整实现。
最后,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 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章