有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

避免耦合的多文件格式的java句柄转换

我正在从事一个Java(RCP)项目,在该项目中,我需要将不同的源文件格式(我们称之为SF-1..N)转换为另外两种不同的目标格式(DF-a、DF-B) 现在输入文件可以是CSV、XLSX和XMLs(具有不同的模式)。应用程序应该找到正确的转换器,因此有必要读取文件内容。 每个转换器规范化文件内容并创建1。。N个DF对象的实例,这些对象转换为DF-A或DF-B记录

因此,我有一些转换器,它们获取文件内容并返回DFs对象的集合。每个转换器还应该能够判断文件内容是否是它支持的内容

我能想到的唯一策略是询问每个转换器是否支持文件内容,以及是否不尝试下一个转换器。如果没有合适的转换器,则向用户返回错误

我还可能被要求添加对新格式的支持,并且我希望能够添加更多转换器,而无需修改不必要的代码

我正在考虑在服务定位器对象中注册每个转换器,但我不确定如何以最小的耦合实现这一点。我曾考虑在静态初始值设定项中注册到服务定位器,但只有在加载类后才会调用它

我该怎么做?有没有更好的方法来实现我的目标


共 (2) 个答案

  1. # 1 楼答案

    M0skit0的答案是好的,但考虑到客户端不知道文件的类型,我会让转换器接口实现CanConvert方法

    然后你可以简单地循环所有的转换器,询问他们是否可以转换文件,并使用第一个可以转换的

    这还有一个优点,即您可以动态添加新的转换器,而无需更改枚举,因此可以在不重新编译应用程序的情况下添加它们

  2. # 2 楼答案

    在这种情况下,工厂设计看起来很合适

    • 制作一个描述转换器合同的接口
    • 为每种文件类型创建一个实现该接口的类
    • 对支持的文件类型进行枚举
    • 将枚举传递给工厂,并使其返回该文件类型的接口实现

    public abstract class DF {
         // Default implementation and abstract methods for each subtype
    }
    
    public class DF_A extends DF {
    }
    
    public class DF_B extends DF {
    }
    
    public final enum FileType {
        XML, CSV, XLSX;
    }
    
    public interface FileConverter {
        DF convert(final URI fileLocation);
    }
    
    class XMLConverter implements FileConverter {
        @Override
        public DF convert(final URI fileLocation) {
            // Convert file to DF and return DF
        }
    }
    
    // And so on for all the file type converters
    
    public class FileConverterFactory {
    
        private static Map<FileType, FileConverter> FILE_CONVERTER_MAP = new HashMap<>();
        static {
            FILE_CONVERTER_MAP.put(FileType.XML, new XMLConverter());
            // And so on for all file types
            // You can make the map unmodifiable
            FILE_CONVERTER_MAP = Collections.unmodifiableMap(FILE_CONVERTER_MAP);
        }
    
        public static final DF convert(final FileType fileType, final URI fileLocation) {
            return FILE_CONVERTER_MAP.get(fileType).convert(fileLocation);
        }
    }
    

    如果客户不知道文件类型,工厂可以修改如下:

    public class FileConverterFactory {
    
        private static Map<FileType, FileConverter> FILE_CONVERTER_MAP = new HashMap<>();
        static {
            FILE_CONVERTER_MAP.put(FileType.XML, new XMLConverter());
            // And so on for all file types
            // You can make the map unmodifiable
            FILE_CONVERTER_MAP = Collections.unmodifiableMap(FILE_CONVERTER_MAP);
        }
    
        private static FileType getFileType(final URI fileLocation) throws UnsupportedFileFormatException {
            // Check file type and return enum as appropriate
        }
    
        // Client knows file type
        public static final DF convert(final FileType fileType, final URI fileLocation) {
            return FILE_CONVERTER_MAP.get(fileType).convert(fileLocation);
        }
    
        // Client doesn't know file type, let factory decide
        public static final DF convert(final URI fileLocation) throws UnsupportedFileFormatException {
            return convert(getFileType(fileLocation), fileLocation);
        }
    }