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

时间:2017-07-18 20:07:51

标签: java design-patterns

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

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

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

目前我有一个定义DocumentParser的java接口,我在不同的包中有几个DocumentParser(例如com.parsers.v1.DocumentParserImpl),我有一个提供者类DocumentParserProvider来提供正确的解析器使用版本(例如public DocumentParser get(String version);)。接口api永远不会改变,也就是说我们总是从界面中询问相同的东西。

是否有更好的方法可以做到这个问题?

2 个答案:

答案 0 :(得分:1)

根据实际解析中涉及的步骤,您还可以应用Template Method pattern(与策略相关):

enter image description here

这有点像应用Do not Repeat Yourself(DRY)并重构解析到模板方法的常用部分,并为不同的部分定义多态方法。应用于解析器的上下文:

enter image description here

如果大多数重复代码与模板方法隔离,则可以停在那里。正如我在关于@Jay的回答的评论中所写的那样,您首先应该看看XML文件的每个版本中是否存在一些不同的模式以及它如何影响解析。你可以

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

这种重构方法可能看起来很多,取决于XML文件版本的变化。在修复错误的情况下,投资可以获得回报。例如,仅使用策略(并且不重构重复的部分),如果您在v1中发现了一个错误并且您必须修复它,那么您最终可能需要重复错误修复 n 次在之后的其他版本中(因为存在错误的代码是复制/粘贴的)。

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

答案 1 :(得分:0)

这听起来像是一种策略模式,因为您希望使用Loader类的不同实现来加载不同的XML文件。

您可以逐个应用程序启动实例化多个Loader实例(或者反复使用所有实例)并将它们存储在工厂中。然后,您可以要求工厂根据XML版本为您提供Loader

如果你想使用DI,你可以拥有一个Map<String, Loader>对象,它只是简单地将XML的版本映射到它的加载器。