了解Swing中的命令模式

时间:2009-06-09 14:20:52

标签: java swing design-patterns

我可以看到Swing如何使用Decorator和Observer模式。

观察者:每个组件(例如JButton)都是可以添加observers(ActionListeners)的主题。当有人按下某个按钮时,它会通过调用ActionListeners来通知所有actionPerformed(ActionEvent e)

但命令模式怎么样?

当我创建实现ActionListener的类(例如:MyActionListener)时,actionPerformed(ActionEvent e)现在是执行命令?

令我感到困惑的是,actionPerformed(ActionEvent e)同时用作execute()update()方法。我在这儿吗?

4 个答案:

答案 0 :(得分:5)

Here is an article that will help.基本上,它表示您可以通过派生ActionListener来创建与目标对象交互的具体命令类。然后,您可以通过将这些解耦命令注册到它来扩展动作事件调用者将要执行的操作。

答案 1 :(得分:3)

是的,所以基本上制作一个封装行为的对象和行动发生时所需的其他信息可以看作是使用command pattern

上面链接的维基百科文章使用Action接口作为Swing中命令模式的示例。 Action接口是ActionListener的子接口,因此实现Action的类必须实现actionPerformed方法。

因此,实现Action的类将封装一些操作,这些操作将在操作发生时执行。可以看出该类本身遵循命令模式。

在实现方面,一般来说,AbstractAction比实现Action更容易使用,因为它有几个需要重写的方法。使用AbstractAction的示例可以是:

class MySpecialAction extends AbstractAction {
    @Override
    public void actionPerformed(ActionEvent e) {
        // Perform operations.
    }
}

MySpecialAction是一个命令模式对象 - 它具有在执行操作时必须显示的行为。在实例化上述类时,可以尝试以下方法:

MySpecialAction action = new MySpecialAction("Special Action", mySpecialIcon);

然后,可以将操作注册到多个组件,例如JButton s,JMenuItem等。在每种情况下,都会调用相同的MySpecialAction对象:

JMenuItem specialMenuItem = new JMenuItem(action);

/* ... */

JButton b = new JButton(action);

在这两种情况下,与每个组件(按钮和菜单项)关联的操作都引用相同的MySpecialAction操作对象或命令。我们可以看到,MySpecialAction对象在命令模式之后作为一个对象运行,因为它封装了一个动作发生时要执行的动作。

答案 2 :(得分:0)

有趣的采取它,你可能是对的,但我认为这是执行的事情,期间。执行操作的原因可能是状态更改或鼠标单击,但它仍然是命令模式意义上的命令。

答案 3 :(得分:0)

以下是我的看法:

http://blue-walrus.com/2011/10/swing-and-design-patterns-%E2%80%93-part-3-command-pattern/

关键是你的行动是一个互换单位。您可以在许多按钮或菜单后面执行此操作。例如。保存操作可以挂在“保存”菜单选项后面,也可以挂在“保存”图标后面。