Как работает шаблон стратегии? [закрытый]


как он работает, для чего он используется и когда его следует использовать?

6 58

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 
    }

}

если вы хотите изменить поведение автомобиля, вы можете просто поменять мотор. (Проще в программе, чем в реальной жизни, не так ли? ; -))

это очень полезно, если у вас есть много сложных состояний: вы можете изменить и поддерживать их гораздо легче.

  • что такое стратегия? Стратегия - это план действий, направленный на достижение конкретной цели;
  • "определения семейства алгоритмов, инкапсуляции каждого из них и делает их взаимозаменяемыми. Стратегия позволяет алгоритму изменяться независимо от клиентов, которые его используют.(Банда из четырех человек);
  • задает набор классов, каждый из которых представляет потенциальное поведение. Переключение между этими классами изменяет поведение приложения. (стратегия);
  • такое поведение может быть выбран во время выполнения (с использованием полиморфизма) или во время разработки;
  • захват абстракции в интерфейсе, похоронить детали реализации в производных классах;

enter image description here

  • альтернативой стратегии является изменение поведения приложения с помощью условной логики. (Плохо);
  • использование этого шаблона упрощает добавление или удаление определенного поведения, без необходимости перекодировать и повторно протестировать все или части применение;

  • хорошо использует:

    • когда у нас есть набор схожих алгоритмов и нужно переключаться между ними в разных частях приложения. С моделью стратегии можно избежать ifs и облегчить обслуживание;
    • когда мы хотим добавить новые методы в суперкласс, которые не обязательно имеют смысл для каждого подкласса. Вместо использования интерфейса традиционным способом, добавляя новый метод, мы используем переменную экземпляра, которая является подкласс нового функционального интерфейса. Это называется композицией: вместо наследования способности через наследование класс состоит из объектов с правильной способностью;

непосредственно с Strategy Pattern Wikipedia article:

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

тесно связанный шаблон-это шаблон делегата; в обоих случаях часть работы передается какому-либо другому компоненту. Если я правильно понимаю, разница между этими шаблонами заключается в следующем (И, пожалуйста, поправьте меня, если я ошибаюсь):

  • на делегат pattern, экземпляр делегата создается классом enclosing (delegating); это позволяет повторно использовать код по составу, а не наследованию. Заключительный класс может быть осведомлен о делегате конкретный тип, например, если он вызывает сам конструктор (в отличие от фабрики).

  • на стратегия pattern, компонент, который выполняет стратегию, является зависимостью, предоставляемой компоненту enclosing (using) через его конструктор или сеттер (в соответствии с вашей религией). Компонент using полностью не знает, какая стратегия используется; стратегия всегда вызывается через интерфейс.

кто-нибудь знает любой другой различия?

чтобы добавить к уже великолепным ответам: шаблон стратегии имеет сильное сходство с передачей функции (или функций) другой функции. В стратегии это делается путем обертывания указанной функции в объект с последующей передачей объекта. Некоторые языки могут передавать функции напрямую, поэтому им вообще не нужен шаблон. Но другие языки не могут передавать функции, но can передать объекты; затем применяется шаблон.

особенно в Java-подобных языках, вы обнаружите, что тип zoo языка довольно мал и что ваш единственный способ расширить его-это создать объекты. Поэтому большинство решений проблем заключается в том, чтобы придумать шаблон; способ создания объектов для достижения конкретной цели. Языки с более богатым типом зоопарков часто имеют более простые способы решения проблем - но более богатые типы также означает, что вы должны тратить больше времени на изучение системы типов. Языки с динамической типизацией дисциплины часто получает скрытый способ обойти проблему, как что ж.