4

我有一组用 Java 实现并打包为 jar 文件的算法。这些算法旨在供第 3 方访问它们。算法有几种变体。随着时间的推移,将添加新版本和新类型的算法。同时,我不会强迫所有第 3 方使用新算法。

我正在考虑为此实施一个简单的存储库系统。要求如下:

  1. 创建/删除存储库,以便每个存储库包含一组算法的变体。
  2. 一个存储库中的算法可以同时运行 serverl 版本。
  3. 可以将新算法添加到存储库中。

是否有一些开源项目符合我的要求?或者是否有一些设计模式可以解决这样的问题?

4

2 回答 2

2

例如,Apache Commons Lang通过在 2.0 和 3.0 版本之间更改其包名称来解决此问题: org.apache.commons.lang成为org.apache.commons.lang3.

来自Commons Lang 3.0 的新增功能?

我们删除了 API 中已弃用的部分,还删除了一些被认为很弱或不必要的功能。所有这些都意味着 Lang 3.0 不能向后兼容。

为此,我们更改了包名称,允许 Lang 3.0 与您之前的 Lang 版本并排放置,而不会产生任何不良副作用。

于 2015-11-23T17:18:36.083 回答
0

正如一些评论中所建议的,基于模式的解决方案是声明接口和实现工厂:

对于每种算法,您应该:

  • 声明它自己的接口,它应该以一种保守的方式及时存在:在新版本中,始终保留现有的 API 而无需修改(因此旧代码始终可以使用它)。如果需要,添加方法。

  • 为您要支持的每个版本编写一个实现。此实现必须具有可见性,并且它们可以共享相同的包,但每个包都有自己的名称。

  • 然后,添加一个工厂来构建实现对象。该工厂应将所需版本作为参数接收:

public class MyFactory { public MyInterface create(String version) throws VersionNotSupportedException {...} } 关于对该工厂进行编码,我还建议您在每个 JAR 中添加META-INF/myfile版本和实现类之间的映射,以便MyFactory它们全部执行:

getClass().getClassLoader().getResources("META-INF/myfile");

更进一步,您可以声明一个通用工厂参数化返回对象的类型:

public class MyGenericFactory<T>
{
    public T create(String version) throws VersionNotSupportedException {...}
}
于 2015-11-24T13:57:24.933 回答