2013-05-08 76 views
0

我有一个关于如何在Swing中实施动作的人。单身动作对多实例动作

我的想法是创建一个类用于扩展AbstractAction这样我就可以在必须具有相同行为的许多组件都使用我的应用程序的每个动作。所以我finaly有一些如:

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教程看到它设置成组件之前,做一个新的实例,并在我还看到很多代码创建新实例对于每个组件,我不知道它是什么更好,为什么。

首选的方法之一是用于其他?

回答

1

多实例操作允许您在操作时刻保存数据以备后用。

想象一下,您想添加撤消/重做功能。您需要保存针对每个操作所做的操作。

单例在这种情况下不提供任何优势。

0

我认为最好的做法是使用MVC模式。你的AbstractAction类是一个控制器。它负责提取模型所需的信息(即:业务逻辑)以供使用。模型/业务逻辑是您重用的部分,但即使使用相同的业务逻辑,控制器也可能会有很大差异。

例如,您可能有一个需要添加KeyListener的JComponent。突然之间,你预先制作的AbstractAction变得毫无价值,因为它不能用于这种情况。但是,只要您重复使用AbstractAction中使用的KeyListener中的所有业务逻辑代码,就可以做到正确。