2016-02-23 50 views
4

我有一個Java的數據結構,我通過不同的方法填充。一種方法從API填充它,另一種方法從解析一些HTML填充它,另一種方法填充它不同的方式,等等。基本上,每種數據源的方法可以填充它。我想知道的是,Java中有哪些設計模式可用於此?對這個問題最好的/最乾淨的面向對象方法是什麼?數據結構的設計模式及其填充方法?

例如,

public class Data { 
    private String foo; 
    private List<String> bar; 
    private Map<String, Integer> baz; 

    public Data (String foo, List<String> bar, Map<String, Integer baz) { 
     this.foo = foo; 
     this.bar = bar; 
     this.baz = baz; 
    } 

    // Setters and Getters here, etc 
} 


public class FacebookParser { 
    private Document dom; 

    public static Data parse(Document dom) { 
     // Parse document 
     // Create Data object 
     return Data; 
    } 
} 

public class TwitterParser { 
    private Document dom; 

    public static Data parse(Document dom) { 
     // Parse Twitter 
     Data d = new Data(stuff from twitter); 
     return d; 
    } 
} 
+1

生成器模式是理想的。看看http://stackoverflow.com/questions/34726422/passing-properties-to-factory-method/34752184#34752184 –

回答

4

你想要一個數據,它以不同的形式表示。您感興趣的部分應該以抽象的方式定義。因此,將數據作爲一個界面是一個很好的開始。

public interface Data { 
    String getFoo(); 
    List<String> getBar(); 
    Map<String, Integer> getBaz(); 
} 

此數據從不同的提供商處獲得。常見的是我們需要有人提供數據。最後,我們唯一感興趣的是數據本身,而不是如何解析或提供。所以我們需要一個簡單的DataProvider接口。

public interface DataProvider { 
    Data createData(); 
} 

現在我們可以實現那些知道如何獲取,解析,處理數據的提供者類。提供者類不應該處理如何將提供者特定數據轉換爲我們的通用數據接口。他們只負責創建他們知道的數據實現。

public class FacebookDataProvider implements DataProvider { 
    public Data createData() { 
     FacebookSpecificInfo x = ... 

     FacebookData data = new FacebookData(); 

     // Note that this class does not know anything about foo, bar and baz. 
     // We are still Facebook context. 
     data.setName(x.getName()); 
     data.setValues(x.getValues()); 
     data.setHeaders(x.getHeaders()); 

     return data; 
    } 
} 

class FacebookData implements Data { 
    private String name; 
    private List<String> values; 
    private Map<String, Integer> headers; 

    void setName(String name) { this.name = name; } 
    void setValues(String values) { this.values = values; } 
    void setHeaders(String headers) { this.headers = headers; } 

    // This is the part where we switch the context and convert 
    // Facebook specific data into our expected Data 
    // ie. Facebook's name field corresponds my foo field. 

    public String getFoo() { return name; } 
    public List<String> getBar() { return values; } 
    public Map<String, Integer> getBaz() { return headers; } 
} 
3

你可以做的是有一個單獨的類來設置數據類的值。

你可以有這樣的事情:

public class DataPopulator{ 

    public void setTwitterData(Data d){ 
    //your data 
    } 

    public void setFacebookData(Data d){ 
    //your data 
    } 

} 

這類似於適配器設計模式的東西,雖然不完全相同。你可以看看它here