java - 处理多种文件格式的转换,避免耦合

标签 java oop design-patterns

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

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

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

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

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

我怎样才能做到这一点?对于我想要实现的目标,有更好的方法吗?

最佳答案

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

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

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

关于java - 处理多种文件格式的转换,避免耦合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29183195/

相关文章:

c# - 存储库模式是否遵循 SOLID 原则?

java - SPRING SECURITY - 总是转向身份验证失败 url

java - 使用按键监听器输出按下的按键

java - 缺少重要参数/依赖项时抛出什么异常?

javascript - ES6 类超出最大调用堆栈大小

javascript - 将数据属性和类/ID 用于 javascript 行为有什么区别?

java - Java删除字符串中相邻的重复项

java - 如何将存储过程的结果映射到 spring-boot/hibernate 中的实体

c# - 面向对象设计与数据库设计

design-patterns - 我们是否有效地使用了 IoC?