这就是我想要做的事:要使用哪种设计模式来实现“数据扩展器”?
public class DataBuilder {
public DataBlock create() {
DataBlock block = new DataBlock();
for (Extender extender : this.getExtenders()) {
extender.extend(block);
}
}
}
一段时间后:
DataBlock block = new DataBuilder().create();
每extender
将添加一些特定的信息到block
。 DataBuilder
并不想知道这些扩展器的内部结构。目前我的getExtenders()
方法查找Extender
(在classpath中)的所有子类,并返回它们的实例。
工作正常,但我不喜欢它的外观,在设计方面。也许我可以/应该使用一些模式,使这个构造更灵活?
诀窍是'this.getExtenders()',它不像应该那样灵活。其余的都是一样的,装饰模式让事情变得更加复杂......就像我看到的那样。对? – yegor256 2010-11-11 12:32:48
@Vincenzo:你错过了一个小而重要的细节。只要您的扩展程序实际上不扩展任何内容,但只执行对象的一次更改,那么您是对的。然而,如果你的扩展器是在对真实对象的调用被执行(想象一个包装器)时扩展对象,那么装饰器模式是正确的方法,因为它增加了更多的灵活性。 – 2010-11-11 12:49:10
@Vincenzo啊,我想我明白你在哪里了。不幸的是,要实例化许多类,您要么必须在某种意义上指定它们的名称,要么使用像您所使用的反射策略。最好你可以希望的是将这个加载封装到某种工厂中,并且可能试图实例化所有实现某个接口(而不是物理类)的类。 – Neil 2010-11-11 13:16:19