将一组对象映射到另一对象

时间:2015-12-10 14:45:27

标签: java oop design-patterns

我正在尝试将数据集(我们称之为Set1)映射到另一个(Set2)。通过将操作应用于Set1的子集并将结果放置到Set2的对象来完成映射。我想知道如何以高效和优雅的方式构建类(尝试学习OOP)。下面的代码正在运行,但类的初始化顺序和内容有点尴尬。

interface Operator{
    public void transform(List<String> from, Element to);
}
class Transform{
    public List<String> fromIndex;
    public Integer toIndex;
    Operator op;
    Mapper m;//NICE TO NOT HAVE ref to Mapper
    Transform(List<String> fromIndex, Integer toIndex, Operator op, Mapper m){
        this.fromIndex = fromIndex;
        this.toIndex = toIndex;
        this.op = op;
        this.m = m;
    }
    public void execute(){
        List<String> from = new ArrayList<String>();
        Element to = m.Set2.get(toIndex);
        for(String s : fromIndex){
            from.add(m.Set1.get(s));
        }
        op.transform(from,to);
    }
}
class Mapper{
    Map<String,String> Set1;
    Map<Integer,Element> Set2;
    List<Transform> transforms;
    Mapper(Map<String,String> Set1, Map<Integer,Element> Set2){
        this.Set1= Set1;
        this.Set2= Set2;
    }
    public void setTransforms(List<Transform> transforms){
        this.transforms = transforms;
    }
    public void doMapping(){
        for(Transform t: transforms){
            t.execute();
        }
    }
}

典型的使用场景,假设已经填充了Set1和Set2(Set2填充了其值将被更新的元素):

List<Transform> tList = new ArrayList<Transform>();
Mapper m = new Mapper(Set1,Set2);
tList.add(new Transform(new ArrayList<String>(Arrays.asList("3", "3_")),3,concatStringToInteger,m));
tList.add(new Transform(new ArrayList<String>(Arrays.asList("4", "4_")),4,concatStringToInteger,m));
tList.add(new Transform(new ArrayList<String>(Arrays.asList("22")),22,concatStringToInteger,m));
tList.add(new Transform(new ArrayList<String>(Arrays.asList("24")),24,concatStringToInteger,m));
m.setTransforms(tList);
m.doMapping();

运营商只是一些可重复使用的lamba exp。正如您所看到的,Transform需要保持ref to mapper,整个初始化很尴尬。这不是关于功能的问题(所以请忽略任何代码错误,代码可以工作),而是关于在OOP(并保持一定程度的通用性)方式中构造它。 感谢

1 个答案:

答案 0 :(得分:0)

您有一个操作,它接受字符串列表并将其映射到Element类型的对象。以编程方式,这意味着可以从字符串列表构建Element类型的对象。

现在,从类型元素开始:

class Element {
      some attributes

      // some default constructor

     // constructor needed for this case,
     Element(List<String> from);
}

程序的其余部分

class Mapper{
     Some Collection of input I
     Element e;
     Some Collection of ouput O

    ...
    within a loop
       // construct a single element 
       e = Element(get input from I)
       // add new element to output collection
       O.add(e)

}