2010-11-11 31 views
1

這就是我想要做的事:要使用哪種設計模式來實現「數據擴展器」?

public class DataBuilder { 
    public DataBlock create() { 
    DataBlock block = new DataBlock(); 
    for (Extender extender : this.getExtenders()) { 
     extender.extend(block); 
    } 
    } 
} 

一段時間後:

DataBlock block = new DataBuilder().create(); 

extender將添加一些特定的信息到blockDataBuilder並不想知道這些擴展器的內部結構。目前我的getExtenders()方法查找Extender(在classpath中)的所有子類,並返回它們的實例。

工作正常,但我不喜歡它的外觀,在設計方面。也許我可以/應該使用一些模式,使這個構造更靈活?

回答

1

繼續阿德里安的答案,我會簡單介紹一下它是如何工作的:

讓我們假設數據塊從名爲IDataBlock的接口派生。每個擴展器派生自DataBlockDecorator,派生自IDataBlock,它對DataBlock執行一些操作(接受構造器中的IDataBlock)。這可以讓你做類似的事情。

IDataBlock block = new DataBlock(); 
for (DataBlockDecorator extender : this.getExtenders()) { 
    extender.extend(block); 
    block = extender; 
} 

但是,它並沒有真正增加以前的靈活性。就此而言,您的原始解決方案已經非常靈活。

+0

訣竅是'this.getExtenders()',它不像應該那樣靈活。其餘的都是一樣的,裝飾模式讓事情變得更加複雜......就像我看到的那樣。對? – yegor256 2010-11-11 12:32:48

+0

@Vincenzo:你錯過了一個小而重要的細節。只要您的擴展程序實際上不擴展任何內容,但只執行對象的一次更改,那麼您是對的。然而,如果你的擴展器是在對真實對象的調用被執行(想象一個包裝器)時擴展對象,那麼裝飾器模式是正確的方法,因爲它增加了更多的靈活性。 – 2010-11-11 12:49:10

+0

@Vincenzo啊,我想我明白你在哪裏了。不幸的是,要實例化許多類,您要麼必須在某種意義上指定它們的名稱,要麼使用像您所使用的反射策略。最好你可以希望的是將這個加載封裝到某種工廠中,並且可能試圖實例化所有實現某個接口(而不是物理類)的類。 – Neil 2010-11-11 13:16:19

0

看看Decorator模式。

+0

你能舉一個簡單的例子裝飾者將如何在我的情況下工作? – yegor256 2010-11-11 11:52:37

+0

@Vincenzo如果我正確理解你的OP,你正在尋找一種模式來添加或編輯塊的行爲,而不需要將任何關於擴展器內部工作的知識嵌入到構建器中。因此,擴展器是您的塊的裝飾器。看看上面的維基百科網站,以獲得深入的解釋和模式的幾個例子。 – 2010-11-11 12:22:49

0

裝飾模式

interface BlockDeckorator 
{ 
    extend(DataBlock block); 
} 

class FooBlockDecoratorImpl implements BlockDecorator 
{ 
    private BlockDeckorator blockDecorator; 

    public FooBlockDecoratorImpl(BlockDecorator decorator) 
    { 
     this.blockDecorator = decorator; 
    } 

    public void extend(DataBlock block) 
    { 
     blockDecorator(block); 
     // Add my own code to do Foo afterwards (or before) 
    } 
} 
相關問題