因此,我们都知道良好的'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;
...
}