Шаблон дизайна Стратегии часто рассматриваются в качестве замены для функций первого класса на языках , которые не имеют их.
Например, скажем, вы хотели передать функциональность в объект. В Java вам нужно передать объекту другой объект, который инкапсулирует желаемое поведение. В таком языке, как Ruby, вы просто передаете функциональность в виде анонимной функции.
Однако я думал об этом и решил, что, возможно, стратегия предлагает больше, чем просто анонимная функция.
Это связано с тем, что объект может содержать состояние, которое существует независимо от периода, когда выполняется его метод. Однако анонимная функция сама по себе может содержать состояние, которое перестает существовать в тот момент, когда функция завершает выполнение.
В объектно-ориентированном языке, который поддерживает первоклассные функции, имеет ли шаблон стратегии какое-либо преимущество перед использованием функций?
источник
Ответы:
Когда язык поддерживает ссылки на функции ( Java поддерживает начиная с версии 8 ), они часто являются хорошей альтернативой для стратегий, потому что они обычно выражают одно и то же с меньшим синтаксисом. Однако в некоторых случаях реальный объект может быть полезен.
Интерфейс Стратегии может иметь несколько методов. Давайте возьмем интерфейс в
RouteFindingStragegy
качестве примера, который инкапсулирует различные алгоритмы поиска маршрута. Это может объявить методы, такие какRoute findShortestRoute(Node start, Node destination)
boolean doesRouteExist(Node start, Node destination)
Route[] findAllPossibleRoutes(Node start, Node destination)
Route findShortestRouteToClosestDestination(Node start, Node[] destinations)
Route findTravelingSalesmanRoute(Node[] stations)
которые затем будут реализованы стратегией. Некоторые алгоритмы поиска маршрута могут разрешать внутреннюю оптимизацию для некоторых из этих вариантов использования, а некоторые - нет, поэтому разработчик может решить, как реализовать каждый из этих методов.
Другой случай, когда стратегия имеет внутреннее состояние. Конечно, в некоторых языках замыкания могут иметь внутреннее состояние, но когда это внутреннее состояние становится очень сложным, часто становится более элегантным продвигать замыкание в полноценный класс.
источник
Неверно, что анонимная функция может содержать состояние, которое перестает существовать, когда функция завершает выполнение.
Возьмите следующий пример в Common Lisp:
Эта функция берет список строк и добавляет счетчик к каждому элементу списка. Так, например, ссылаясь
дает
Функция
number-strings
внутренне использует анонимную функцию с переменной,counter
которая хранит состояние (текущее значение счетчика), которое повторно используется каждый раз, когда вызывается функция.В общем, вы можете думать о замыкании как об объекте только с одним методом. В качестве альтернативы, объект - это коллекция замыканий, которые используют одни и те же закрытые переменные. Поэтому я не уверен, есть ли случаи, когда вам нужно использовать объект вместо замыкания: я бы сказал, что оба способа представляют один и тот же шаблон с разных точек зрения.
В частности, шаблон стратегии требует объект только с одним методом, поэтому замыкание должно делать эту работу. Но, как заметил Филипп в своем ответе, в зависимости от обстоятельств (сложного состояния) и языков программирования вы можете получить более элегантное решение, используя объекты.
источник
let
а затем определить свое замыкание внутри него. По сути, я бы определил объект одним методом на лету. На другом языке (например, Java) может быть более удобно (синтаксически проще) определить надлежащий объект для хранения состояния. Итак, я бы решил от случая к случаю.Тот факт, что два проекта могут решить одну и ту же проблему, не означает, что они являются прямыми заменами друг другу.
Если вам нужно отслеживать состояние в функциональной программе, вы не изменяете закрытую переменную, даже если язык это позволяет. Вы организуете вызов функции, которая принимает одно состояние в качестве аргумента и возвращает новое состояние в качестве возвращаемого значения.
Ваша архитектура будет выглядеть совсем иначе, но вы достигнете той же цели. Не пытайтесь навязать паттерны одной парадигмы непосредственно другой.
источник
Стратегия - это концепция , полезный рецепт для решения конкретной, повторяющейся проблемы. Это не языковая конструкция и не какая-либо форма реализации . Закрытие может быть использовано для реализации Стратегии в один день и Наблюдателя на следующий день.
Термин стратегия в основном используется в разговорах с другими программистами , чтобы лаконично выразить ваше намерение. В этом нет ничего волшебного.
источник