Как работает шаблон стратегии? [закрытый]
как он работает, для чего он используется и когда его следует использовать?
6 ответов:
давайте объясним шаблон стратегии простым способом:
у вас есть класс
Car()
методомrun()
, Так что вы используете его таким образом в псевдо язык:mycar = new Car() mycar.run()
теперь, вы можете изменить
run()
поведение на лету, в то время как программа выполняется. Например, вы можете имитировать отказ двигателя или использование кнопки" boost " в видеоигре.есть несколько способов сделать это моделирование: с помощью условных операторов и флага переменная-это один из способов. Паттерн стратегии другой: он делегирует поведение
run()
метод подкласса:Class Car() { this.motor = new Motor(this) // passing "this" is important for the motor so it knows what it is running method run() { this.motor.run() } method changeMotor(motor) { this.motor = motor } }
если вы хотите изменить поведение автомобиля, вы можете просто поменять мотор. (Проще в программе, чем в реальной жизни, не так ли? ; -))
это очень полезно, если у вас есть много сложных состояний: вы можете изменить и поддерживать их гораздо легче.
- что такое стратегия? Стратегия - это план действий, направленный на достижение конкретной цели;
- "определения семейства алгоритмов, инкапсуляции каждого из них и делает их взаимозаменяемыми. Стратегия позволяет алгоритму изменяться независимо от клиентов, которые его используют.(Банда из четырех человек);
- задает набор классов, каждый из которых представляет потенциальное поведение. Переключение между этими классами изменяет поведение приложения. (стратегия);
- такое поведение может быть выбран во время выполнения (с использованием полиморфизма) или во время разработки;
- захват абстракции в интерфейсе, похоронить детали реализации в производных классах;
- альтернативой стратегии является изменение поведения приложения с помощью условной логики. (Плохо);
использование этого шаблона упрощает добавление или удаление определенного поведения, без необходимости перекодировать и повторно протестировать все или части применение;
хорошо использует:
- когда у нас есть набор схожих алгоритмов и нужно переключаться между ними в разных частях приложения. С моделью стратегии можно избежать ifs и облегчить обслуживание;
- когда мы хотим добавить новые методы в суперкласс, которые не обязательно имеют смысл для каждого подкласса. Вместо использования интерфейса традиционным способом, добавляя новый метод, мы используем переменную экземпляра, которая является подкласс нового функционального интерфейса. Это называется композицией: вместо наследования способности через наследование класс состоит из объектов с правильной способностью;
непосредственно с Strategy Pattern Wikipedia article:
шаблон стратегии полезен для ситуаций, когда необходимо динамически менять местами алгоритмы, используемые в приложении. Шаблон стратегии предназначен для обеспечения средств определения семейства алгоритмов, инкапсуляции каждого из них в качестве объекта и обеспечения их взаимозаменяемости. Шаблон стратегии позволяет алгоритмам изменяться независимо от клиентов, которые их используют.
тесно связанный шаблон-это шаблон делегата; в обоих случаях часть работы передается какому-либо другому компоненту. Если я правильно понимаю, разница между этими шаблонами заключается в следующем (И, пожалуйста, поправьте меня, если я ошибаюсь):
на делегат pattern, экземпляр делегата создается классом enclosing (delegating); это позволяет повторно использовать код по составу, а не наследованию. Заключительный класс может быть осведомлен о делегате конкретный тип, например, если он вызывает сам конструктор (в отличие от фабрики).
на стратегия pattern, компонент, который выполняет стратегию, является зависимостью, предоставляемой компоненту enclosing (using) через его конструктор или сеттер (в соответствии с вашей религией). Компонент using полностью не знает, какая стратегия используется; стратегия всегда вызывается через интерфейс.
кто-нибудь знает любой другой различия?
чтобы добавить к уже великолепным ответам: шаблон стратегии имеет сильное сходство с передачей функции (или функций) другой функции. В стратегии это делается путем обертывания указанной функции в объект с последующей передачей объекта. Некоторые языки могут передавать функции напрямую, поэтому им вообще не нужен шаблон. Но другие языки не могут передавать функции, но can передать объекты; затем применяется шаблон.
особенно в Java-подобных языках, вы обнаружите, что тип zoo языка довольно мал и что ваш единственный способ расширить его-это создать объекты. Поэтому большинство решений проблем заключается в том, чтобы придумать шаблон; способ создания объектов для достижения конкретной цели. Языки с более богатым типом зоопарков часто имеют более простые способы решения проблем - но более богатые типы также означает, что вы должны тратить больше времени на изучение системы типов. Языки с динамической типизацией дисциплины часто получает скрытый способ обойти проблему, как что ж.