我正在设计一个我必须做的项目。为此,我曾想过使用装饰设计模式。但是,我必须将我的设计调整到项目的现有实施。然后,我无法完全保留装饰设计模式。java中的装饰设计模式
该项目有一个抽象基类(称为A)和一组子类(称为A1,A2,A3,A4等)。我无法修改这些类的代码。
然后,我有额外的funcionality添加到这些类。为此,我创建了一个用于类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(的)一个匿名类应该创建一个不同的匿名类,如果第一个参数deppending上的BMaker.get()为A1,A2,A3,...
真的,我不知道这是否是可能做到这一点,还是有其他更好的办法。
任何帮助,将不胜感激!
你在* decorator *与* delegator *混淆。你试过委托人,但是*想*装饰者。搜索维基百科的条款。 – Bohemian