如何实现算法存储库



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

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

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

是否有一些开源项目符合我的要求?还是像这样的问题有一些设计模式?

举个例子,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 并排,没有任何不好的一面 影响。

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

对于每种算法,您应该:

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

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

  • 然后,添加一个工厂来生成实现对象。此工厂应接收所需的版本作为参数:

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 {...}
}

最新更新