Какую модель дизайна использует Collections.sort?

При применении компаратора к списку следующим образом, каков используемый шаблон проектирования или какой метод используется здесь?

Collections.sort(myCollection, new Comparator<MyItem>() {

    @Override
    public int compare(MyItem item1, MyItem item2) {
        return item1.getId().compareTo(item2.getId());
    }

});

Ответ 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?

Ответ 2

Collections.sort() использует Strategy шаблон.

Ответ 3

Я думаю, что было бы лучше сначала взглянуть на другую форму

Collections.sort(myCollection)

Который не получает Алгоритм для сравнения элементов во время выполнения. В этом подходе он использует Алгоритм, который обеспечивается наследованием для Элементов (путем реализации интерфейса Comparable). Не в прямом направлении, но если мы посмотрим на это немного гибко, это Шаблон шаблона. Этот подход использует наследование, и поведение элементов не может измениться во время выполнения.

Но во второй форме

Collections.sort(myCollection, сравнительный алгоритм)

Мы отправляем поведение во время выполнения, в отличие от шаблона шаблона (Наследование), которое возможно, когда мы используем время выполнения и изменяемое поведение. Что является самой важной частью шаблона стратегии.

Кто-нибудь может спросить, где находится составная часть Шаблон стратегии здесь? Композиция - это не просто держать Алгоритм так, чтобы он использовался всякий раз, когда это требуется. Но в этом случае всякий раз, когда требуется алгоритм, он передается как аргумент, потому что класс Collections - это класс Utils, который используется для разных целей, а не класс Context, который мы видим в оригинальной версии шаблона стратегии.