Различия между шаблоном разработки стратегии и поведением реализации - PullRequest
0 голосов
/ 25 февраля 2020

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

Одним из способов является шаблон проектирования стратегии. таким образом, стратегия объекта «имеет-а», которая представляет поведение.

другой способ - заставить этот объект «реализовать» поведение (интерфейс).

, например, в В игре у меня есть объект «Враг», и один Враг летит, а другой - за рулем. так что до сих пор я думал бы: первый объект Enemy реализует Flyable, а второй Enemy реализует Drivable. но другим решением может быть первый «Враг» - «FlyingStrategy», а второй - «DrivingStrategy».

Я пытаюсь найти лучшее решение с точки зрения хорошего дизайна.

Спасибо.

1 Ответ

0 голосов
/ 25 февраля 2020

Они не взаимозаменяемы. Хороший пример - Comparable против Comparator в JDK.

В вашем случае Comparable представляет собой реализацию интерфейса. Comparator является примером шаблона стратегии. С двумя подписями Collections.sort вы можете сделать это

Collections.sort(listOfComparables);

или

Collections.sort(anyList, comparator);

Представьте, что у вас есть список Car с. Возможно, вы захотите отсортировать список по цвету, по количеству мест, по лошадиным силам. В этом случае нет смысла внедрять Comparable. Автомобили не имеют естественного заказа; нет смысла отдавать предпочтение одному упорядочиванию над другим путем реализации интерфейса. В этом случае все заказы создаются равными. Если бы вы объявили автомобиль как Comparable, он, скорее всего, не был бы интуитивно понятным для пользователей вашего класса. Возможно, им придется проверить реализацию или документацию, чтобы выяснить, какой порядок вы намеревались. Вы должны отсортировать их, используя Comparator s.

Теперь представьте, что у вас есть список Coin s. Монеты имеют довольно очевидный естественный порядок: их номинал. Вы могли бы сортировать свои монеты по размеру или весу, но их основной причиной существования является представление разных номиналов. В этом случае не все заказы созданы равными. Здесь имеет смысл реализовать Comparable, и, если требуются другие упорядочения, вы можете использовать для этого Comparator s.

В более общем смысле шаблон стратегии часто лучше всего применять при наличии никто не "предпочитал" подход. Класс может реализовать интерфейс только один раз, но он может использовать множество различных стратегий. Это своего рода инверсия управления .

...