我有一个关于如何在Swing中实现Actions的家伙。
我的想法是为我的应用程序扩展AbstractAction的每个操作创建一个类,这样我就可以在许多必须具有相同行为的组件中使用。所以我最终得到了as
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教程中看到,它在将其设置为组件之前创建一个新实例,并且在我也看到许多代码为每个组件创建新实例,所以我不知道它更好,为什么。
是首选的一种方法比其他使用?
多实例操作允许您在操作时保存数据以供以后使用。
假设你想添加撤销/重做功能。您需要为每个操作保存已完成的操作。
单例在这种情况下没有任何优势。
我认为最好的办法是使用MVC模式。AbstractAction类是一个控制器。它负责提取模型(即:业务逻辑)使用的必要信息。模型/业务逻辑是您重用的部分,但是即使使用相同的业务逻辑,控制器也可能有很大的不同。
例如,你可能有一个需要添加KeyListener的JComponent。突然之间,您预先制作的AbstractAction变得毫无价值,因为它不能在这种情况下使用。但是,只要您重用了在AbstractAction中使用的KeyListener中的所有业务逻辑代码,那么您就做对了。