Java避免Decorator中的包装器方法

Java避免Decorator中的包装器方法,java,decorator,Java,Decorator,如果您想在Java中向现有类添加新的行为,您可以子类化或使用Decorator模式。如果使用Decorator模式,最终必须实现接口中的所有方法,并且只需调用修饰对象: class DecoratedList<T> extends List<T> { List<T> baseList; int size() { return baseList.size(); } //..like the method above

如果您想在Java中向现有类添加新的行为,您可以子类化或使用Decorator模式。如果使用Decorator模式,最终必须实现接口中的所有方法,并且只需调用修饰对象:

class DecoratedList<T> extends List<T>
{
    List<T> baseList;
    int size() {
        return baseList.size();
    }
    //..like the method above, but for every method on List..

    //The added behaviour
    T secondThing() {
        return baseList.get(1);
    }
}
然而,子类化并不需要传递所有的样板方法

class DecoratedList<T> extends ArrayList<T>
{
    //The added behaviour
    T secondThing() {
        return list.get(1);
    }
}
问题是,这只能在需要ArrayList的情况下使用,也只能在可以访问ArrayList构造的情况下使用。我知道在本例中,您可以将ArrayList中的元素复制到自己创建的装饰列表中,但这仅适用于列表,并不总是合适的

是否有一些方法可以添加到类中,如果在DecoratedList类中找不到该方法,请将其转发到baseList,以避免出现一堆不做任何新事情的单行方法:

class DecoratedList<T> extends List<T>
{
    List<T> baseList;

    //pseudocode
    methodNotFound(method, arguments) {
        method.InvokeOn(baseList, arguments);
    }

    //The added behaviour
    T secondThing() {
        return baseList.get(1);
    }
}

您应该能够使用proxy,尽管我不建议您首先使用它,List是一个接口,而不是一个类;扩展列表应引发编译器错误。为了避免装饰集合的样板文件,请根据需要扩展AbstractList和implements。@dhke抱歉,我指的是implements List。这是行不通的,因为如果有一个列表没有扩展AbstractList呢?我在这里以列表为例,但这种情况也适用于任何给定的interface@Dilip我在上一节所说的,尽管我现在已经澄清了。正如我所解释的,子类化不适合,所以有没有一种方法可以避免使用一堆只传递调用的单行方法。最好是在编译的时候time@Jonathan您需要一个动态代理。看见但是,如果您事先知道要装饰的界面,那么一定要使用常规代理。IDE应该可以帮助您快速实现这些简单的方法。