类/算法的多个版本的设计模式

awk*_*rts 3 java design-patterns

我正在存储和解析 xml 文件,这些文件会随着时间的推移而演变,因此在存储时我还会存储格式的版本。

当我加载 xml 时,我会获取该文件的版本,并根据该版本使用特定的 java 类来处理它。xml 格式每隔几周就会更改一次,因此会创建一个新类并将其添加到类列表中。我可以随时加载任何版本的 xml(例如,今天我可以加载两年前使用 v02 版本创建的 xml 文件,而当前版本为 v26)

有针对此类问题的设计模式吗?是否有使用依赖注入的设计模式来解决此类问题?

目前,我有一个定义 a 的 java 接口DocumentParser,并且每个文档解析器都位于不同的包中(例如com.parsers.v1.DocumentParserImpl),并且我有一个提供程序类DocumentParserProvider来使用版本(例如public DocumentParser get(String version);)提供正确的解析器。接口 api 永远不会改变,也就是说我们总是从接口中请求相同的事情。

有没有更好的方法来做到这一点或者这个问题有一个名称吗?

Fuh*_*tor 5

根据实际解析中涉及的步骤,您还可以应用模板方法模式(与策略相关):

在此输入图像描述

这有点像应用“不要重复自己”(DRY)并将解析的公共部分重构为模板方法,并为不同的部分定义多态方法。应用于解析器的上下文:

在此输入图像描述

如果大部分重复代码被隔离到模板方法中,那么您可以到此为止。正如我在对 @Jay 的回答的评论中所写的那样,您应该首先查看 XML 文件的每个版本中是否存在某种不同的模式以及它如何影响解析。你可以

  • parseOperation只为容易变化的部分定义(提取方法重构),模板方法在parse正确的时间调用它们。
  • 更进一步,看看parseOperations 本身是否重复。如果是这样,则将重复的代码放入其他类中(提取类重构以使用组合)。理想情况下,如果发生任何复制/粘贴重复,请将其提取到某种 ParseUtility 类中(或者它可能是抽象类中的静态函数,具体取决于您如何测试/重用它们)。

这种重构方法可能看起来需要大量工作,具体取决于 XML 文件版本的更改内容。如果修复了错误,这笔投资就会得到回报。例如,仅使用策略(并且不重构重复的部分),如果您发现错误并且v1必须修复它,那么您可能最终不得不在之后的其他版本中重复错误修复n次(因为存在错误的代码是复制/粘贴的)。

在很少或没有重复的重构版本中,如果错误被隔离在 中ParseUtil.refactoredRepeatedMethod1(),那么您只需在那里修复一次即可。