ИМХО, сохраняя реализацию как можно более простой, я бы посоветовал вам пойти по простой фабричной схеме.
Определите фабричный сервис только для выполнения 2 операций:
- Получение заданной карты всех параметров, таких как source, dest. дата и т.д ...
- Теперь простой метод transformModel (Map, SourceAgg Type)
Определите родительский класс, который имеет общие поля вашего POJO (скажем, BasePOJO ), а затем расширяйте все другие типы POJO агрегатора источника (предполагая, что у всех будут разные имена полей и т. Д.). Поскольку каждый ваш источник агг. классы будут иметь свою собственную логику для создания POJO, специфичного для этого типа агрегатора источника.
Чтобы связать каждый исходный класс, импл. поддерживать перечисление: (sourceType, sourceAggClass)
например:
enum sourceAgg {
(EXPEDIA, ExpediaModelImpl),
(VIA, ViaModelImpl); }
Все, что вам нужно сделать, это получить реализацию, основанную на ключе агрегатора исходного кода (скажем, EXPEDIA ) из перечисления, так как у вас есть имя компонента в контексте, вы можете легко вызвать transformModel функция для каждого типа. Объект, возвращаемый transformModel от каждого источника agg. классы будут иметь тип BasePOJO, его легко обрабатывать как формальные параметры.
В будущем , если вы хотите добавить новый агрегатор исходного кода, все, что вам нужно сделать, это просто написать модель преобразования этого класса и добавить в перечисления enum, вот и все!
PS: Это мой второй ответ на SO, предложения приветствуются.