我有一个关于如何在Swing中实现Actions的人。
我的想法是为我的应用程序的每个动作创建一个类,扩展AbstractAction,这样我就可以在许多必须具有相同行为的组件中使用。所以我最终有一些东西:
public class ActionExample extends AbstractAction {
@Override
public void actionPerformed(ActionEvent arg0) {
System.out.println("Do something");
}
}
好吧,现在当我想要使用它时,我脑子里有三个选择:
public void makeUI1() {
JButton btn = new JButton(new ActionExample("Do it"));
JMenuItem mi = new JMenuItem(new ActionExample("Do it"));
}
public void makeUI2() {
Action a = new ActionExample("Do it");
JButton btn = new JButton(a);
JMenuItem mi = new JMenuItem(a);
}
或者将其用作单身人士(也改变ActionExample):
public void makeUI2() {
JButton btn = new JButton(ActionExample.getInstance());
JMenuItem mi = new JMenuItem(ActionExample.getInstance());
}
public class ActionExample extends AbstractAction {
private static final ActionExample INSTANCE = new ActionExample("Do it");
public static Action getInstance() {
return INSTANCE;
}
@Override
public void actionPerformed(ActionEvent arg0) {
System.out.println("Do something");
}
}
我的第一个意见是通过单例实例,但我在oracle教程中看到它在将其设置为组件之前创建了一个新实例,而且我也看到很多代码为每个组件创建新实例,所以我不知道什么是更好的,为什么。
首选一种方法用于另一种方法吗?
答案 0 :(得分:1)
多实例操作允许您在操作时刻保存数据以供进一步使用。
想象一下,您想要添加撤消/重做功能。您需要保存为每个操作执行的操作。
Singleton在这种情况下没有任何优势。
答案 1 :(得分:0)
我认为最好的办法是使用MVC模式。您的AbstractAction类是一个控制器。它负责提取模型所需的信息(即:业务逻辑)以供使用。模型/业务逻辑是您重用的部分,但即使控制器使用相同的业务逻辑,控制器也可能有很大差异。
例如,您可能需要添加KeyListener的JComponent。突然之间,你预制的AbstractAction变得毫无价值,因为它不能在这种情况下使用。但是,只要重用您在AbstractAction中使用的KeyListener中的所有业务逻辑代码,就可以正确地执行操作。