2010-07-12 33 views
1

我想使用複合模式將一個對象接收到的呼叫轉發給其他人。具有不同類型對象的複合圖案

目前,接收端的物體都是一樣的Abstract類型,但障礙是他們根據具體類型(認爲不同的模型)選擇性地接受不同類型的objet作爲參數。

據我所看到的,有兩個解決方案,但都不是令人滿意的:

  • 使用instanceof來檢測輸入端類類型的對象。這通常被認爲是一種不好的做法。
  • 儘可能多的有Lists,因爲有輸入類型。這帶來了必須添加List以適應新的輸入類型的問題,並且每個List必須依次進行明確處理。

我一直在接口方面想,但還沒有提出一個可行的想法。什麼是解決這個設計問題的方法?綜合是否合適?

P.S:這是在mvc的上下文中。

回答

3

複合圖案允許您將對象的集合視爲與葉對象相同。

我想說的是,你可以做這樣的事情:

public interface Command 
{ 
    void execute(Object parameter); 
} 

public class LeafCommand implements Command 
{ 
    public void execute(Object parameter) 
    { 
     // do something for a leaf 
    } 
} 

public class CompositeCommand implements Command 
{ 
    private List<Command> commands; 

    void execute(Object parameter) 
    { 
     for (Command child : commands) 
     { 
      child.execute(parameter); 
     } 
    } 

} 

這就是複合對我意味着什麼。你是對的 - 如果你不得不使用instanceof你做錯了。

+0

是的,這也是我看到複合材料的方式。對於我所描述的內容,將會有一種方法讓'Command'根據它的類型忽略參數Object。該對象仍然會使用相同的方法傳遞,但會讓我回到在Command中使用'instanceof'。 – 2010-07-12 22:35:58

+0

我會說可能在具體類中有多個重載的方法簽名和相應的實現。難道你不需要做什麼? – duffymo 2010-07-12 22:40:00

+0

好吧,考慮一下,我想要做的是在想法上與在工廠中使用的選擇過程相似,以根據它們的大小分隔項目(想象篩選)。不同的重載方法將是理想的,但是對象類型允許一些靈活性是一個障礙。也許我想的太難了,有一個更簡單的方法。我想到的另一件事是可以拋出一個對象,忽略ClassCastException,並且只在引用不爲null時才執行某些操作。 – 2010-07-12 23:20:45

0

我在Java Practices的StocksMonitor應用程序中找到了以下方法。這是主要的視圖的在MVC上下文中的更新方法:

public void update(Observable aObservable, Object aData) { 
    fLogger.fine("Notify being broadcast..."); 
    if (aObservable == fCurrentPortfolio) { 
     fLogger.fine("Notified by Current Portfolio..."); 
     synchTitleBarWithCurrentPortfolio(); 
    } 
    else if (aObservable == fGeneralLookPrefs) { 
     fLogger.fine("Notified by General Look..."); 
     synchGuiWithGeneralLookPrefs(); 
    } 
    } 

的參考文獻,其用於有選擇地更新相應的視圖不同的模型的實例。這種方法尊重組合模式,並允許根據參數實例進行逐案處理。當然,這隻依賴於運行時使用的模型的一個實例。

+0

另一種可能性是創建一個包含某種類型標識符(如String)的自定義對象。這可以代替Object參數發送。 – 2010-07-13 21:08:38

相關問題