Java 数据结构的设计模式及其填充方法?

Java 数据结构的设计模式及其填充方法?,java,design-patterns,Java,Design Patterns,我有一个Java数据结构,我通过不同的方法填充它。一个方法通过API填充它,另一个方法通过解析一些HTML填充它,另一个方法以不同的方式填充它,等等。基本上,每个可以填充它的数据源都有一个方法。我想知道的是,Java中有哪些设计模式可用于此目的?解决这个问题的最佳/最干净的OOP方法是什么 例如: 公共类数据{ 私人字符串foo; 私人列表栏; 私人地图; 公共数据(字符串foo、列表栏、Map您可以使用一个单独的类来设置数据类的值 你可以有这样的东西: public class DataPop

我有一个Java数据结构,我通过不同的方法填充它。一个方法通过API填充它,另一个方法通过解析一些HTML填充它,另一个方法以不同的方式填充它,等等。基本上,每个可以填充它的数据源都有一个方法。我想知道的是,Java中有哪些设计模式可用于此目的?解决这个问题的最佳/最干净的OOP方法是什么

例如:

公共类数据{
私人字符串foo;
私人列表栏;
私人地图;

公共数据(字符串foo、列表栏、Map您可以使用一个单独的类来设置数据类的值

你可以有这样的东西:

public class DataPopulator{

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

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

}
这与适配器设计模式类似,但并不完全相同


你可以看一看。

你想要一个数据,它以不同的形式表示。你感兴趣的部分应该以抽象的方式定义。因此,将数据作为一个接口是一个很好的起点

public interface Data {
    String getFoo();
    List<String> getBar();
    Map<String, Integer> getBaz();
}
现在我们可以实现那些知道如何获取、解析、处理等数据的提供者类。提供者类不应该处理如何将特定于提供者的数据转换为我们的公共数据接口。他们只负责创建他们知道的数据实现

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; }
}
公共类FacebookDataProvider实现DataProvider{
公共数据createData(){
FaceBookSpecificationInfo x=。。。
FacebookData数据=新的FacebookData();
//注意,这个类对foo、bar和baz一无所知。
//我们仍然是Facebook的背景。
data.setName(x.getName());
data.setValues(x.getValues());
data.setHeaders(x.getHeaders());
返回数据;
}
}
类FacebookData实现数据{
私有字符串名称;
私有列表值;
私有映射头;
void setName(字符串名){this.name=name;}
void setValues(字符串值){this.values=values;}
void setHeaders(字符串头){this.headers=headers;}
//这是我们切换上下文并转换的部分
//将特定于Facebook的数据转换为我们的预期数据
//例如,Facebook的名称字段对应于我的foo字段。
公共字符串getFoo(){return name;}
public List getBar(){返回值;}
公共映射getBaz(){return headers;}
}

Builder模式非常适合它。请看
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; }
}