這就是我想要做的事:要使用哪種設計模式來實現「數據擴展器」?
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