2015-11-23 7 views
4

У меня есть набор алгоритмов, реализованных в Java и упакованных как файлы jar. Алгоритмы предназначены для третьей стороны для доступа к ним. Алгоритмы имеют несколько вариантов. Сверхурочная работа, новые версии и новые типы алгоритмов будут добавлены. В то же время я не хочу, чтобы все третьи стороны были вынуждены использовать новый алгоритм.как реализовать хранилище алгоритмов?

Я рассматриваю возможность внедрения простой системы репозитория для этого. Требования заключаются в следующем:

  1. создание/удаление репозиториев, так что каждое репо содержит один набор вариантов алгоритма.
  2. Алгоритмы в одном репозитории могут иметь серверные версии, запущенные одновременно.
  3. новые алгоритмы могут быть добавлены к репо.

Есть ли какой-то проект с открытым исходным кодом, соответствующий моему требованию? Или есть какой-то шаблон дизайна для таких проблем?

+6

Поиск интерфейсов и заводов. (Забавно, что вы должны упомянуть «шаблон дизайна».) – greybeard

+1

Я думаю, что интерфейсы и фабрики только абстрагируют внешнее поведение репо, но я думаю о лучшей практике для внутреннего механизма репо. например Как упаковать различные версии алгоритмов в банку. Как сохранить их, как обратиться к определенной версии и т. Д. – xing

+0

Для каждого заданного алгоритма каждая версия реализована в отдельном классе (отличное полное имя)? – dotvav

ответ

2

В качестве одного примера, Apache Commons Lang решить эту проблему, изменив их название пакета между версиями 2.0 и 3.0: org.apache.commons.lang стал org.apache.commons.lang3.

От What's new in Commons Lang 3.0?

Мы удалили устаревшие части API и также удалены некоторые особенности, которые были признаны слабыми или ненужными. Все это означает , что Lang 3.0 не поддерживает обратную совместимость.

С этой целью мы изменили название пакета, позволяя Lang 3.0 сидеть бок о бок с вашей предыдущей версией Lang без каких-либо плохих сторон. Эффекты .

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