在任何AbstractAction执行之后应该调用特殊方法

时间:2011-07-18 19:13:16

标签: java design-patterns abstract-action

请原谅模糊的问题标题,但通常我不会做这样的事情。所以我有以下问题:

我正在为特定应用设计弹出菜单,其中每个菜单项都与某个操作相关联:

public class CanvasMenu extends JPopupMenu {        
    public CanvasMenu(){
       this.add(new AbstractAction("Do some operation") {
           @Override
           public void actionPerformed(ActionEvent arg0) {
                doSomeStuff1();
                cleanup(); // has to be done after every menu operation
           }
    });

        this.add(new AbstractAction("Other operation") {
            @Override
            public void actionPerformed(ActionEvent e) {
                doSomeOtherStuff();
                cleanup(); // has to be done after every menu operation
            }
        });
    }
}

我在某处读到AbstractAction用于此类任务,您希望添加菜单项并将其与某些操作相关联。实际上,我不仅需要两个这样的动作,而且还需要几十个动作。

问题在于cleanup。 {em}应该在选择了这些操作的任何之后cleanup。这意味着,如果我继续以上述方式继续,我将必须为每个cleanup()撰写AbstractAction

是否有任何(简单/优雅/漂亮)方式或模式可以避免一遍又一遍地写cleanup()?即是否有可能设计出只会获得操作的内容,并在执行后自动调用cleanup

1 个答案:

答案 0 :(得分:3)

这是其中一种模式:

abstract class ActionWithCleanup extend AbstractAction {
       @Override
       public final void actionPerformed(ActionEvent arg0) {
            myAction();
            cleanup(); // has to be done after every menu operation
       }

       public abstract void myAction();
}

...

this.add(new ActionWithCleanup("Do some operation") {
       @Override
       public void myAction() {
            doSomeStuff1();
       }
});