2014-10-17 47 views
0

假設我有一個標記接口,像這樣:該接口的處理以特定方式實現的泛型列表

public interface Widget { }; 

和各種實現方式:

public class AWidget implements Widget { 
    .... 
    public String getSomeAttribute() { return ...; } 
} 

public class AnotherWidget implements Widget { 
    .... 
    public String getAnotherAttribute() { return ...; } 
} 

進一步假設我有一些代碼,創建一個List並嘗試處理它們:

List<? extends Widget> widgets = someMethodToCreateWidgets(); 

是東西如通過以下可能的,其中在一個I類循環和處理部件

for(Widget widget : widgets) { 
    anotherClass.process(widget); 
} 

anotherClass有方法簽名像下面?

public class AnotherClass { 
    public void process(AWidget widget) { 
     .... 
     widget.getSomeAttribute(); 
     .... 
    } 

    public void process(AnotherWidget widget) { 
     .... 
     widget.getAnotherAttribute(); 
     .... 
    } 
} 

我覺得我以前在概念上看過類似於這個的實現,但我正在努力獲得類似它的工作。最終,我試圖避免必須有一堆

if (widget instanceof AWidget) { 
    ... 
} 
else if (widget instanceof AnotherWidget) { 
    ... 
} 
+0

對於每種獨特的屬性,過程方法是否會獨特地處理事物? – NESPowerGlove 2014-10-17 19:55:39

+0

是的,每個「小部件」都會有不同的處理要求和他們自己的獨特屬性。我知道一個選擇是可能採取命令模式的方法,但我的目標是保持處理獨立於小部件本身。 – Centinul 2014-10-17 19:57:37

+0

那麼你可以添加一個流程方法到Widget,或者你可以讓Widget返回一個屬性列表,它有自己的流程方法(屬性可以是一個枚舉,每個枚舉元素都有一個唯一的進程實現,這樣你可以共享從一個Widget子類到另一個的屬性代碼,我想這將取決於如果一個獨特的處理是基於屬性或屬性加小部件子類型)。 – NESPowerGlove 2014-10-17 20:01:17

回答

1

如果我理解正確的話,你要找的東西,就是所謂的「雙重分派」一種process()方法。訪問者模式是處理這種情況的一種常見方式:http://en.wikipedia.org/wiki/Visitor_pattern

+0

謝謝! 「雙重調度」這個詞是我一直在尋找但不記得的。 – Centinul 2014-10-17 23:32:03