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

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

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问题。 cleanup应该在选择任何这些动作之后。这意味着,如果我以上述方式继续,我将必须为每个cleanup()编写AbstractAction

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

最佳答案

这是模式之一:

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();
       }
});

10-07 17:43