Переключатель с несколькими альтернативами услуг - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть коммутатор, вызывающий несколько сервисов, таких как:

switch (condition) {
case 1:
    return service1.methodA(args....);
case 2:
    return service2.methodX(args....);
case 3:
    return service3.methodZ(args....);
.
.
.
default:
    break;
}

Каков наилучший способ реализации этого?

Сервисы @Autowired и возвращают один и тот же объект.

1 Ответ

0 голосов
/ 21 февраля 2019

Вы можете заставить их всех реализовывать общий интерфейс:

interface YourCommonServiceName {
    YourReturnObject yourMethodName(/* your arguments */);
}

Тогда изначально вы можете добавить все сервисы на карту в зависимости от их состояния:

private final Map<Integer, YourCommonServiceName> services;

@Autowired
public YourClass(YourCommonServiceName serviceA, YourCommonServiceName serviceB, /* ... */) {
    Map<Integer, YourCommonServiceName> map = new HashMap<>();

    map.put(1, serviceA);
    map.put(2, serviceB);
    // ...

    services = Collections.unmodifiableMap(map);
}

Затем выможно просто вызвать services -карту с условием в качестве аргумента:

YourCommonServiceName service = services.get(condition);
if(service == null) {
    // do something if nothing matches
    return;
}

и затем вызвать метод с аргументами:

YourReturnObject o = service.yourMethodName(args...);

Вы можете создать эту карту также непосредственно в@Configuration класс:

@Bean
public Map<Integer, YourCommonServiceName> services(YourCommonServiceName serviceA, YourCommonServiceName serviceB, ...) {
    Map<Integer, YourCommonServiceName> map = new HashMap<>();

    map.put(1, serviceA);
    map.put(2, serviceB);
    // ...

    return Collections.unmodifiableMap(map);
}

А затем введите Map в ваш другой класс:

public YourClass(Map<Integer, YourCommonServiceName> services) {
    this.services = services;
}
...