Шаблон проектирования Java для различных вариантов одного и того же ввода для преобразования в общий вывод - PullRequest
0 голосов
/ 26 октября 2018

У меня есть сценарий, где есть сервисный агрегатор, например, Skyscanner, Kayak или Google рейсы. Если вы видите, все они спрашивают основные детали, такие как источник, пункт назначения, дата и количество пассажиров, как только вы выбираете рейс у конкретного поставщика услуг, скажем, например, в компании «Экспедиа», вы будете перенаправлены в «Экспедию» с предварительно заполненными данными, которые были отправлено сервис-агрегатором

Теперь имя параметров, отправляемых из исходной системы, может отличаться, и в месте назначения мы должны преобразовать его в тот же POJO.

Одним из вариантов, о котором я думал, был шаблон Factory, основанный на канале. Я бы возвратил объект, который преобразует исходные параметры в общий POJO.

Другой шаблон проектирования, который мне кажется похожим, - это шаблон разработки стратегии, позволяющий создать ExtractionStrategy на основе контекста

Есть ли другой способ проектирования, способный решить эту проблему?

1 Ответ

0 голосов
/ 26 октября 2018

ИМХО, сохраняя реализацию как можно более простой, я бы посоветовал вам пойти по простой фабричной схеме. Определите фабричный сервис только для выполнения 2 операций:

  1. Получение заданной карты всех параметров, таких как source, dest. дата и т.д ...
  2. Теперь простой метод transformModel (Map, SourceAgg Type)

Определите родительский класс, который имеет общие поля вашего POJO (скажем, BasePOJO ), а затем расширяйте все другие типы POJO агрегатора источника (предполагая, что у всех будут разные имена полей и т. Д.). Поскольку каждый ваш источник агг. классы будут иметь свою собственную логику для создания POJO, специфичного для этого типа агрегатора источника.

Чтобы связать каждый исходный класс, импл. поддерживать перечисление: (sourceType, sourceAggClass)

например:

enum sourceAgg { (EXPEDIA, ExpediaModelImpl), (VIA, ViaModelImpl); }

Все, что вам нужно сделать, это получить реализацию, основанную на ключе агрегатора исходного кода (скажем, EXPEDIA ) из перечисления, так как у вас есть имя компонента в контексте, вы можете легко вызвать transformModel функция для каждого типа. Объект, возвращаемый transformModel от каждого источника agg. классы будут иметь тип BasePOJO, его легко обрабатывать как формальные параметры.

В будущем , если вы хотите добавить новый агрегатор исходного кода, все, что вам нужно сделать, это просто написать модель преобразования этого класса и добавить в перечисления enum, вот и все!

PS: Это мой второй ответ на SO, предложения приветствуются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...