Я реализую несколько стратегий (Стратегическая модель), которые имеют некоторое общее поведение, и не решено, где общие операции должны жить.
Опция 1: Сделайте класс AbstractStrategy
Опция 2: Создайте класс Util статических помощников
Какие-либо рекомендации или предпочтения?
Отметьте уровень, в котором я работаю, уровень Стратегии, не уровень Контекста (см., что Википедия связывается).
Есть одна причина ... одна огромная причина ... использовать статический класс Util вместо абстрактного класса или интерфейса.
Так что вы можете добавить больше методов позже.
В случае абстрактного класса или интерфейса любое изменение, которое вы вносите в этот класс / интерфейс, должно быть изменено во всех классах, которые унаследованы от него. Это особенно проблематично, если вы пишете публичный API.
В структуре Java есть служебные классы со статическими методами, разбросанными по всему сайту. Наиболее известные из них находятся в пакете java.util
: Коллекции
и Массивы
.
Есть много способов добиться этого.
Используйте абстрактный класс и превратите переменные части выполнения в абстрактные методы. => Некоторые стратегии будут реализовывать все операции (путем переопределения абстрактных методов), в то время как другие могут пропускать необязательные. Обратите внимание, что в этом случае необязательные операции могут быть пустыми методами перехвата, а не абстрактными методами. Таким образом вы избежите проблем, связанных с реализацией этих операций как пустых методов в подклассе.
Используйте реальный интерфейс «Стратегии» (с методом execute, как в статье в Википедии, на которую вы указали). Затем клиентский класс будет предоставлен реализацией стратегии (может быть анонимным внутренним классом или реальным классом полноценной стратегии).
Первый более простой, но более жесткий: если вам нужно изменить количество операций (особенно абстрактных), необходимо обновить все подклассы.
Второй вариант более гибкий, но вам нужно будет найти способ «разделить» общие операции между разными стратегиями путем делегирования или использования статических служебных методов.
Есть еще один вариант в дополнение к двум, которые вы перечислили:
Мне кажется, вам нужна какая-то композиция, в которой вы можете использовать только ту функциональность, которая вам нужна. Возможно, вы могли бы упаковать свои операции, используя шаблон команд, а затем собрать из них свои стратегии?
Преимущества:
Недостатки:
если она объявлена как Abstract, люди могут догадаться, что она предназначена для расширения. Поэтому лучше объявить частный конструктор.