Шаблон стратегии с использованием java 8 и сервисным внедрением - PullRequest
0 голосов
/ 23 апреля 2020

Я пытаюсь реализовать шаблон стратегии для некоторой пользовательской проверки, которая не включает только ввод проверки с базовыми c операциями, но мне нужно вызвать некоторые другие службы для проверки данных.

В начале я использовал упомянутый пример здесь , в котором перечисления используются для разных стратегий, но, конечно, было невозможно внедрить мои службы в перечисление, поэтому сейчас я смотрю на this который использует java 8 для большей ясности.

Моя идея состоит в том, чтобы иметь интерфейс с одним методом validate() и иметь общий ввод c для различных объектов, которые я мог бы отправить, а затем класс, реализующий этот интерфейс, который будет иметь разные проверки на основе типа объекта и отправлять запросы различным службам, но с другой стороны, я теряю преимущество enum, потому что у меня есть разные стратегии, которые я мог бы выбрать, например, на основе определенных пользовательских настроек c.

Есть идеи, как использовать оба эти преимущества?

Ответы [ 2 ]

0 голосов
/ 24 апреля 2020

Хотелось бы предложить использовать группы javax.validation, подробнее об этом здесь особенно @Validated(OnCreate.class)

Если вы хотите применить шаблон стратегии на уровне контроллера и глубже, чем см. эту статью и особенно мой комментарий , потому что там описано не совсем чистое решение.

0 голосов
/ 24 апреля 2020

Я бы сказал, что перечисления и шаблон стратегии на самом деле не смешиваются.

Идеальным вариантом использования перечисления является то, что представляет собой исчерпывающий набор вариантов. DayOfWeek, например, с понедельника по воскресенье. Проблема с использованием этого, в дополнение к невозможности автоматической передачи каких-либо других bean-компонентов, состоит в том, что ваше перечисление будет продолжать расти с увеличением числа проверок.

Шаблон стратегии позволяет вам использовать потенциально бесконечное число возможных стратегий при условии соблюдения контракта. Взять, к примеру, Collections.sort(List<T> list, Comparator<? super T> c). Не может быть исчерпывающего списка возможных компараторов, потому что он никогда не сможет удовлетворить все варианты использования.

Имеет больше смысла определять каждую из ваших возможных стратегий как компонент

@Component 
class NonNullValidationStrategy implements ValidationStrategy {
    private final MyService service;

    //constructor

    @Override
    public boolean isValid(MyClass foo) {
        return foo != null;
    }
}

То, как вы получите экземпляр правильной стратегии, когда она вам понадобится, будет зависеть от деталей, которых у вас нет ' т предоставляется. Возможно, возможно автоматическое подключение с квалификатором.


У Spring уже есть собственный способ определения проверок через интерфейсы и аннотации . Я предлагаю вам продолжить, прежде чем предлагать собственное решение.

...