Ответ 1
TL; DR:
Collections.sort
является примером простой полиморфной замены независимо от того, используете ли вы функциональное программирование или объектно-ориентированное программирование, чтобы сделать эту замену. Термин Strategy Pattern не является взаимозаменяемым с полиморфизмом или функциональным программированием.
Можно все же сказать, что мы передаем сортировку Strategy
в метод sort
, но без Context
, это не синоним шаблону стратегии.
При применении компаратора к списку следующим образом, каков используемый шаблон проектирования или какой метод используется здесь?
Поскольку этот вопрос отмечен как ООП, здесь не используется ООП. Это простой старый полиморфизм в действии. Некоторые программисты могут назвать этот шаблон стратегии, но я не согласен. Шаблон стратегии защищает композицию над наследованием, где вы используете отношения has-a, а не отношения is-a.
Некоторые программисты могут также утверждать, что мы передаем сортировку Strategy
методу Collections.sort
, так что это шаблон стратегии; однако нужно признать, что Strategy
является одним из компонентов шаблона стратегии. Другим важным компонентом шаблона стратегии является его Context
, который устанавливает связь HAS-A со Стратегией. Этот компонент играет центральную роль в мотивации шаблона стратегии, который должен предпочесть состав над наследованием. Вы не можете принять участие в целом и по-прежнему называть эту разделенную часть целым. Вы не можете вывести Context
из шаблона стратегии и по-прежнему вызывать остальную часть шаблона стратегии.
Collections.sort
- это метод static
, который позволяет вам Полиморфно заменить реализацию Comparator
, которая будет использоваться во время выполнения.
Поддерживающий материал
Посмотрим на определение шаблона стратегии из GoF:
Инкапсуляция алгоритма в объект является целью Стратегии (315). Ключевыми участниками шаблона являются Стратегия объекты (которые инкапсулируют разные алгоритмы) и контекст в которые они используют. Композиторы - это стратегии; они инкапсулируют различные алгоритмы форматирования. Композиция - это контекст стратегии компоновщика.
....
Состав объекта предлагает потенциально более работоспособный и гибкий механизм расширения.
Теперь должно быть ясно, что существует тонкая разница между полиморфизмом и шаблоном стратегии. В шаблоне Стратегия описывается контекст, который использует композицию, выделенную в жирным шрифтом выше. Класс Collections
не устанавливает отношения композиции с компаратором. Кроме того, диаграмма классов для шаблона стратегии показывает компонент, называемый контекстом, который составляет интерфейс стратегии.
Этот вопрос был помечен как ООП, но если мы хотим поговорить о том, какой шаблон Collections.sort
представлял бы, когда речь заходит о парадигме функционального программирования, я бы сказал, что он представляет собой функциональное программирование. (Если бы мне пришлось приравнивать передачу функции методу к шаблону ООП, я бы сказал, что он близко (не полностью) больше напоминает шаблон команды, чем шаблон стратегии)
Сопутствующий контент: Выполняет ли функциональное программирование шаблоны проектирования GoF?