【发布时间】:2013-11-02 23:31:28
【问题描述】:
我正在设计一个我必须做的项目。为此,我曾考虑使用装饰器设计模式。但是,我必须根据项目的现有实施调整我的设计。然后,我不能完全保留装饰器设计模式。
该项目有一个抽象基类(称为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,...)覆盖 A 类(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、...的匿名类 对 BMaker.get() 的每个调用都应该创建一个不同的匿名类,具体取决于 BMaker.get() 的第一个参数是否为 A1,A2,A3,...
真的,我不知道是否可以这样做或是否有其他更好的方法。
任何帮助将不胜感激!
【问题讨论】:
-
您将 decorator 与 delegator 混淆了。您尝试了委托,但 想要 装饰。在维基百科中搜索这些术语。
标签: java design-patterns inheritance anonymous-class