Java IntelliJ能否自动创建装饰器类?

Java IntelliJ能否自动创建装饰器类?,java,intellij-idea,design-patterns,decorator,Java,Intellij Idea,Design Patterns,Decorator,有时,我会创建一个装饰器类,如下所示: class MyInterfaceDecorator implements MyInterface { private final MyInterface delegate; ... constructor taking a MyInterface instance ... @Override public Object someInterfaceMethod(Some argument) { return dele

有时,我会创建一个装饰器类,如下所示:

class MyInterfaceDecorator implements MyInterface {
   private final MyInterface delegate;
   ... constructor taking a MyInterface instance ...

   @Override
   public Object someInterfaceMethod(Some argument) {
       return delegate.someInterfaceMethod(argument);
   }

   ... etc, more methods here...
}

IntelliJ能自动为我创建这个类吗?

更新//

我注意到IntelliJ有一个生成委托方法的“Generate”选项。创建一个新类:

public class MyDecoratorClass {
    private MyInterfaceWithManyMethods myInterface;
}
然后标记myInterface,进入菜单>代码>委托方法,选择所有要包装的方法,就这样

//更新结束

您可以尝试“重构”->“用委托替换继承”重构。它应该能够做到这一点,就像这样。我称之为“Alt+Enter的代码”

转到要为其生成装饰器的接口

public interface MyInterfaceWithManyMethods {
    void method1();
    void method2();
    void method3();
}
按Alt+Enter,选择“ImplementInterface”,为您的装饰器命名,如“MyDecorator”。这给你

public class MyDecorator implements MyInterfaceWithManyMethods {
    public void method1() {
    }
    public void method2() {
    }
    public void method3() {
    }
}
在NewClass中,选择类名,然后“重构”->“用委派替换继承”,选择您的接口,勾选所有方法名,按enter键。您将获得:

public class MyDecorator {

    private final MyObject object = new MyObject();

    public void method1() {
        object.method1();
    }

    public void method2() {
        object.method2();
    }

    public void method3() {
        object.method3();
    }

    private class MyObject implements MyInterfaceWithManyMethods {
        public void method1() {

        }

        public void method2() {

        }

        public void method3() {

        }
    }
}
手动删除内部类和对象初始值设定项。你会得到:

public class MyDecorator {


    public void method1() {
        object.method1();
    }

    public void method2() {
        object.method2();
    }

    public void method3() {
        object.method3();
    }

}
在现在标记为红色的“对象”上按Alt+Enter,选择“创建字段”,选择MyInterfaceWithManyMethods

public class MyDecorator {


    private MyInterfaceWithManyMethods object;

    public void method1() {
        object.method1();
    }

    public void method2() {
        object.method2();
    }

    public void method3() {
        object.method3();
    }

}
选择对象变量,按Alt+Enter,选择“添加构造函数参数”:


您可以看到,这一切都是通过Alt+Enter的几次笔划完成的。读起来像是做了很多工作,但可以在不到20秒内完成。如果您只有2或3个方法,那么使用活动模板可能会更快,但是如果您有许多具有复杂签名的方法,那么使用此方法将在大约20秒钟内获得工作结果。Alt+Enter:D

您可能可以添加一个文件模板,如:

class ${NAME} implements ${INTERFACE} {
   private final ${INTERFACE} delegate;

   public ${NAME}(final ${INTERFACE} delegate) {
       this.delegate = delegate;
}
然后,当您使用此模板创建文件时,只需使用 Alt+Inser和choice委托方法。
它并不完美,但这可能是一个快捷方式

当您想从Scratch创建类时,我不知道它是如何工作的。我为您添加了完整的描述。完整答案为Thx+1:)。我编写了一个文件模板,因为创建模板时,您只需创建文件,然后只需创建一个“Alt+Inser”。创建的时间应该与您的解决方案几乎相同,但键盘操作更少。至少Intellij 8已经有了生成委托。不错,但如果它还可以生成要实现的方法(委托调用委托对象),那就更好了。
class ${NAME} implements ${INTERFACE} {
   private final ${INTERFACE} delegate;

   public ${NAME}(final ${INTERFACE} delegate) {
       this.delegate = delegate;
}