我正在设计一个我必须做的项目。为此,我曾考虑使用装饰器设计模式。但是,我必须根据项目的现有实施调整我的设计。然后,我不能完全保留装饰器设计模式。
该项目有一个抽象基类(称为A)和一组子类(称为A1、A2、A3、A4等)。我无法修改这些类的代码。
然后,我必须为这些类添加额外的功能。为此,我创建了一个用于 A 类(装饰器)的抽象类(称为 B)。我还创建了用于 A1、A2、A3、A4、... 类的具体装饰器
注意:如您所见,我不使用任何接口,因为 A 类不使用任何接口,我无法修改此代码。
但是我在这个设计中看到了一些问题:
1) 类 B1,B2,B3,B4,... 必须添加类 A1,A2,A3,A4,... 的所有方法以调用 A1,A2,A3,A4... 类的方法... 例如,在 B1 类中:
class B1 {
public A1 objectA1;
B1() {
objectA1 = new A1();
}
public void add(int value) {
objectA1.add(value);
// extra funcionality
}
}
这可能是个问题,因为如果其他开发人员修改 A、A1、A2、A3、A4、...类的代码,他们还需要修改 B、B1、B2、B3、B4、...的代码为了防止这种情况。
2)此外,类 A、A1、A2、A3、A4 具有只能从自己的类或子类访问的受保护方法。由于我需要访问这些方法,我不能使用装饰器设计模式。
第二种选择
我可以用 B1、B2、B3、B4 扩展 A1、A2、A3、A4 类。例如:
class B1 extends A1 {
B1() {
objectA1 = new A1();
}
public void add(int value) {
super.add(value);
// extra funcionality
}
}
这样,我解决了第二个问题,避免覆盖 A1 的所有方法,只覆盖必要的方法。即便如此,每次创建 A 的子类时,都必须创建相应的 B 类。我想防止这种情况发生,因为只需要 B 类(B1,B2,...)覆盖类的方法一个(A1,A2,...)。
第三种选择
然后,我认为我可以考虑将 B 类(B1,B2,...)作为 A 类(A1,A2,...)的包装器。这样,将创建一个 B 的实例,如下所示:
new BMaker.get(A1, params_of_constructor_A1)
new BMaker.get(A2, params_of_constructor_A2)
new BMaker.get(A3, params_of_constructor_A3)
new BMaker.get(A4, params_of_constructor_A4) or
...
new BMaker.get(AN, params_of_constructor_AN)
其中 BMaker.get 是一个静态方法。
public static <T extends A> A get (T objectA, params ) {
// return anonymous class (*1)
}
我的问题是,是否有可能实现一个继承 A1、A2、... ,A2,A3,...
真的,我不知道是否有可能做到这一点,或者还有其他更好的方法。
任何帮助,将不胜感激!