У меня есть различные типы событий, как показано ниже. В общем, у меня больше событий.
EventA
EventB
EventC
EventD
EventE
Ниже приведен код, в котором я получу каждый тип событий:
public void run() {
try {
while (!closed.get()) {
ConsumerRecords records = consumer.poll(10000);
// Handle new records
for (ConsumerRecord<String, String> record : records) {
GenericRecord payload = decoder.decode(record.value());
String eventType = String.valueOf(payload.get("eventType"));
String eventMapHolder = String.valueOf(payload.get("eventMapHolder"));
Map<String, String> eventHolder = parseStringToMap(eventHolder);
// here eventType will "EventA", "EventB" and so on
// pass eventType to get the individual factory for that event type
// and then pass eventHolder to a particular method of that factory class which calls appropriate Query method.
}
}
} catch (Exception e) {
// log error
}
}
Для каждого события мне нужно выполнять разные запросы к базе данных, но, по крайней мере, для большинства из них мне нужно выполнить один запрос к базе данных, который является общим для всех из них. Например:
EventA -----> QueryA, QueryB
EventB -----> QueryA
EventC -----> QueryA, QueryC
EventD -----> QueryA, QueryD
EventE ----->
Ниже будет поток:
EventA -----> QueryA, QueryB
EventB -----> QueryA
eventHolder EventC -----> QueryA, QueryC
EventD -----> QueryA, QueryD
EventE ----->
- Итак, скажем, я получаю «EventA» как тип события в коде, который у меня есть в моем вопросе, затем я передам карту eventHolder методу (давайте назовем это как QueryA), и в этом методе я выполню некоторую операцию на этой карте и вернусь новая Карта. И затем эта новая карта будет передана другому методу (давайте назовем этот QueryB), а затем снова мы выполним какую-то операцию над этим, а затем вернем другую карту, а затем эта карта вернется к вызывающему.
- Теперь предположим, что «EventB» приходит как тип события в коде, который у меня есть в моем вопросе, затем я передам карту eventHolder методу (давайте назовем это как QueryA), и в этом методе я выполню некоторую операцию на этой карте и верну новая Карта. И затем эта карта будет передана обратно вызывающему абоненту.
- Теперь предположим, что «EventE» приходит как тип события в коде, который у меня есть в моем вопросе, тогда я передам карту eventHolder классу EventE, и, поскольку в этом случае нам ничего не нужно делать, я передам эту карту как есть обратно к звонящему.
Вопрос:
Какой шаблон проектирования я должен использовать для такого рода проблем? Я хочу избежать использования if/else или переключателя здесь, потому что в целом у меня много типов событий, поэтому я думаю о создании для них отдельной фабрики, которую мы можем динамически загружать во время выполнения, передавая значение eventType.
Я заранее знаю все типы событий, поэтому я могу статически инициализировать все фабрики, поместив их в карту, а затем, как только во время выполнения кода появится тип события, я могу загрузить отдельные фабрики из карты.
Как я могу использовать здесь абстрактный фабричный шаблон для достижения этой цели, если это правильный шаблон проектирования для этой проблемы? Я хочу передать "eventType"
в качестве ключа фабрике, которая вернет экземпляр этого типа события. Итак, скажем, я передам "EventA"
фабрике, а затем она вернет класс фабрики для "EventA"
, а затем мы вызовем определенный метод в этом классе, который внутренне вызывает метод QueryA, а затем мы вызовем метод QueryB, и в конце он вернет карту, которая Я распечатаю его в приведенном выше коде. И аналогично для других типов событий.
Я кое-что подумал на эту тему: я не уверен, возможно ли это вообще с фабричным шаблоном или может быть какой-то другой шаблон проектирования. (Мои соглашения об именах могут быть перепутаны, я просто придумал эти имена ниже)
EventFactory eventFactory = EventTypeFactory.getInstance().getFactory(eventType);
Map<String, String> holder = eventFactory.execute(eventHolder);