双向数据格式转换的设计模式

时间:2016-05-28 07:00:10

标签: java oop design-patterns data-conversion

我正在处理一个处理不同数据格式的项目。

例如,假设我有以下数据格式:

formatA, formatB, formatC, ...

以下课程。

formatA

public class dataFormatA {

    private String data;

    public dataFormatA(String data) {
        this.data = data;
        // convertData(this.data);
    }

    public dataFormatB convertToDataFormatB() {
        return new dataFormatB(data);
    }

    public dataFormatC convertToDataFormatC() {
        return new dataFormatC(data);
    }

}

formatB

public class dataFormatB {

    private String data;

    public dataFormatB(String data) {
        this.data = data;
        // convertData(this.data);
    }

    public dataFormatA convertToDataFormatA() {
        return new dataFormatA(data);
    }

    public dataFormatC convertToDataFormatC() {
        return new dataFormatC(data);
    }

}

formatC

public class dataFormatC {

    private String data;

    public dataFormatC(String data) {
        this.data = data;
        // convertData(this.data);
    }

    public dataFormatA convertToDataFormatA() {
        return new dataFormatA(data);
    }

    public dataFormatB convertToDataFormatB() {
        return new dataFormatB(data);
    }
}

最好的设计模式是什么?目前,每个类都有一种方法将其数据类型转换为其余的数据格式类。但这不是一个好的设计,因为它违反了公开关闭原则

1 个答案:

答案 0 :(得分:0)

您能设计一种(或极少数)中间格式吗?我们称这种格式为M;那么您只需要从每种格式到M,从M到每种格式的转换器。添加更多格式变得简单。

如果您在每对格式之间进行了一种非常平凡且独特的转换方式,那么您就会遇到一个完整的矩阵。

您仍然不需要将转换器代码保留在格式类中。

相反,我创建了一个通用的转换器接口:

interface FormatConverter<SRC, DST> {
   DST convertFrom(SRC);
}

现在你可以使用你喜欢的任何机制来实现这个接口,可能有一堆转换器类。

转换器可以通过包级别可见性查看每个格式类的某些非公开详细信息。或者,它们可以是格式的内部类。 OTOH再次在格式类和转换器之间产生紧密耦合,因此可能违反开闭原则。