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

Java 双向数据格式转换的设计模式,java,oop,design-patterns,data-conversion,Java,Oop,Design Patterns,Data Conversion,我从事的一个项目将处理不同的数据格式 例如,假设我有以下数据格式: formatA, formatB, formatC, ... 下面的课程 格式a: public class dataFormatA { private String data; public dataFormatA(String data) { this.data = data; // convertData(this.data); } public da

我从事的一个项目将处理不同的数据格式

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

formatA, formatB, formatC, ...
下面的课程

格式a

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);
    }

}
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);
    }

}
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);
    }
}
格式b

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);
    }

}
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);
    }

}
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);
    }
}
格式C

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);
    }

}
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);
    }

}
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);
    }
}
最好的设计模式是什么?目前,每个类都有一个将其数据类型转换为其他数据格式类的方法。但是这不是一个好的设计,因为它违反了开闭原则。你能设计一种(或少量)中间格式吗?让我们把这种格式称为
M
;然后您只需要从每种格式到
M
,以及从
M
到每种格式的转换器。添加更多格式变得很容易

如果在每一对格式之间都有一种特殊的转换方式,那么就必须有一个完整的矩阵

您仍然不需要将转换器代码保存在format类中

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

interface FormatConverter<SRC, DST> {
   DST convertFrom(SRC);
}
接口格式转换器{
DST转换源(SRC);
}
现在,您可以使用任何想要实现此接口的机制,可能是通过拥有一组转换器类


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

那么所有实现的公共接口(
interface DataContainer{String getData();}
呢?这将消除转换的需要,或者允许类似
public dataFormatC的构造函数(数据容器其他)
。如何在保持类型安全的情况下动态转换数据格式?似乎查找正确转换器的唯一方法是使用反射或服务定位器,不是吗?因此,编译器无法检测丢失的转换。因此,如果我有4个数据格式类,我需要创建一个12类组合,用于从类型转换另一个?