因此,我们都知道良好的'ol Decorator模式,尤其是我在Internet上找不到任何缺点。但是我可以想到一个大的:

如果您的基类碰巧很笨重(可容纳50个字段),那么您决定装饰它:

public class BulkyBaseClass {

    // 50 fields
    //...
}

class Decorator extends BulkyBaseClass{

    private BulkyBaseClass mBase;

    public Decorator(BulkyBaseClass bulkyBaseClass){
        this.mBase = bulkyBaseClass;
    }

    // Some overrides to decorate the composed base class
}

然后,我们不能在这里看到装饰器本身的大多数字段都没有用,而我们真的只对正在装饰的类的字段感兴趣,这会导致很大的内存占用吗?

对我来说,这是一个很大的劣势。是不是

最佳答案

是的,对于具有多个字段的类,直接使用装饰器模式确实有一个缺点,因为它们的大多数在包装mBase实例的派生类中未使用。

但是,缺点是继承于实现而不是继承接口。因此,您可以通过从BulkyBaseClass提取接口并在Decorator类中使用它来轻松修复它:

interface LeanInterface {
    void method1();
    int method2();
}
class BulkyBaseClass implements LeanInterface {
    ...
}
class Decorator implements LeanInterface {
    private BulkyBaseClass mBase;
    ...
}

09-20 04:02