Вскрытие! Шаблон стратегии чаще всего используется при разработке проектов.

Шаблоны проектирования
Вскрытие! Шаблон стратегии чаще всего используется при разработке проектов.

предисловие

В ежедневном процессе кодирования есть три оси шаблонов проектирования: шаблоны, компоновщики и стратегии.Сегодня давайте поговорим о третьей оси.Шаблоны разработки стратегии

Режим стратегии относительно прост и используется чаще.Обычно мы используем режим стратегии, чтобы исключить код множественных суждений, таких как «если-иначе» и «переключатель», и устранить множественные суждения «если-иначе» и «переключатель».Может эффективно справляться со сложностью кода

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

Далее будет подробно описано, как использовать шаблон проектирования для создания демонстрации, реальная сцена шаблона и преимущества шаблона стратегии.

Схема шаблона разработки стратегии выглядит следующим образом:

  1. Что такое паттерн стратегии
  2. Реальные сценарии приложений в проектах Spring
  3. Как играть в режиме стратегии в нижней части исходного кода фреймворка
  4. Обзор режима стратегии

Что такое паттерн стратегии

Шаблон стратегии определен в книге GoF «Шаблоны проектирования» следующим образом:

Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary independently from clients that use it.

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

Увидев приведенное выше введение, вы можете не понять, что такое режим стратегии.Здесь мы начнем с самого основного кода и шаг за шагом освоим этот режим. Следующий код может быть связан с соответствующим бизнесом,В соответствии с соответствующим типом скидки цена будет снижена соответственно

Этот код может удовлетворить бизнес-потребности проекта, и многие коды, которые были запущены в производственной среде, также содержат этот тип кода. Однако у этого фрагмента кода есть два недостатка.

  1. Сложность кода, нормальная логика бизнес-кода определенно будет намного сложнее, чем этот кодовый блок, который к тому жеВызывает ветки if-else и слишком много кода. Этот подход можно решить, разбив код на независимые функции или на классы.
  2. Принцип открытия и закрытия, уступка в цене обязательно будетвносить разные изменения в разное время, возможно добавление, удаление или изменение. Если в функции страшно вносить изменения, подумайте о возможности того, что несколько разработчиков могут работать отдельно, беспорядочные комментарии, хаотичная логика кода и т. д.

Как использовать шаблон стратегии для оптимизации приведенного выше кода, чтобы дизайн программы выглядел простым и расширяемым

  1. Упростите сложность кода и определить различные типы предложений как разные классы внедрения алгоритма стратегии.
  2. Гарантия принципа открытости-закрытости, повышение надежности и масштабируемости программы

Пример шаблона стратегии

Преобразование приведенного выше блока кода в шаблон разработки стратегии требует примерно трех шагов.

  1. Определите абстрактный интерфейс стратегии, потому что, если бизнес использует интерфейс вместо конкретного класса реализации, он может гибко заменять различные стратегии.
  2. Определения конкретной политики класса реализации, реализуют абстракцию политики от интерфейса, что конкретная реализация службы внутри пакета
  3. Определите политические фабрики, внедрение политики создания пакетов (алгоритм), чтобы заблокировать конкретные детали создания для клиентов

На данный момент интерфейс абстрактной стратегии, конкретный класс реализации стратегии и фабрика стратегий созданы, теперь вы можете видеть, как клиент должен вызывать и как скрыть от клиента конкретные детали реализации.

Согласно изображению блока кода, конкретный класс стратегии получается из фабрики стратегий, что действительно отменяет конструкцию if-else.Реализовано с использованием стратегии хранения карты на заводе. После получения класса стратегии выполните конкретный метод предпочтительной стратегии, чтобы получить сумму со скидкой.

Благодаря анализу мы знаем, что текущий дизайн действительно уменьшил сложность кода приложения.Если вы добавляете предпочтительную стратегию, вам нужно только добавить класс реализации алгоритма стратегии.. Однако добавление реализации алгоритма политики,означает, что код в фабрике политик нужно изменить, всё равно не соответствует принципу открыто-закрыто

Чтобы полностью реализовать шаблон стратегии, соответствующий принципу открытого-закрытого, требуется помощь Spring.Пожалуйста, продолжайте читать подробный пример ниже.

Реальные сценарии применения в проекте

Функция, разработанная в недавнем проекте, использует режим стратегии, который разделен на два типа ролей. Автор отвечает за определение абстрактного интерфейса стратегии и фабрики стратегий. Различные алгоритмы стратегии должны быть реализованы различными бизнес-партнерами, которые могут быть связаны с функцией купона выше. Поскольку это проект Spring, он обрабатывается так же, как и Spring.

Видно, что есть два очевидных изменения по сравнению с примером кода выше.

  1. В интерфейсе абстрактной стратегии заново определен интерфейс mark(), который используется для обозначения уникальности алгоритма.
  2. Класс реализации конкретной стратегии украшен @Component, а сам объект управляется Spring.

Советы: для удобства чтения, mark() вместо этого возвращает непосредственно строку, и читателям лучше использовать определение перечисления при возврате отметки.

Далее продолжите рассмотрение того, как можно преобразовать фабрику абстрактных стратегий, чтобы она соответствовала принципу «открыто-закрыто».

Как и в предыдущем режиме цепочки ответственности (добавить ссылку TODO), контейнер IOC вызывается через реализацию интерфейса InitializingBean для поиска соответствующей реализации стратегии, а затем в качестве ключа используется возвращаемое значение метода mark() реализации стратегии, а сама реализация стратегии добавляется в контейнер Map как значение Ожидание звонка от клиента

Используемый здесь тестовый класс SpringBoot внедряет bean-компонент фабрики стратегий, выбирает конкретный класс алгоритма стратегии с помощью фабрики стратегий, а затем получает льготную цену с помощью алгоритма. Небольшой эпизод: если вы не хотите внедрять фабрику политик в Spring, вы можете, есть много способов реализовать это

Подводя итог этому разделу, мы объединились со Spring, чтобы оптимизировать блок кода в начале статьи с помощью шаблона разработки стратегии: справиться со сложностью кода и сделать так, чтобы он соответствовал принципу открытости-закрытости. Более конкретно, этоУменьшите сложность кода, абстрагировав класс алгоритма стратегии, а затем одновременно удовлетворив принципу открытости-закрытости с помощью некоторых функций Spring., теперь есть новые требования, просто добавьте новый класс стратегии, надежный и легко расширяемый

Как играть в режиме стратегии в нижней части исходного кода

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

В понимании автора JDK, Spring, SpringMvc, Mybatis, Dubbo и т. д. используют шаблон проектирования стратегии.Вот пример Mybatis.

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

Executor представляет абстрактный интерфейс стратегии.Только что упомянутый шаблон метода шаблона является производным от BaseExecutor.

Конфигурация представляет собой фабрику стратегий, отвечающую за создание конкретных классов реализации алгоритма стратегии.

SimpleExecuto, ReuseExecutor... Представляет конкретный класс реализации алгоритма стратегии, который его инкапсулирует.

Приведенный выше блок кода выполняется в классе Configuration для создания исполнителя Executor и создает различные алгоритмы стратегии на основе суждения executorType.

Приведенный выше блок кода не устраняет полностью if-else, потому что стратегия исполнителя в Mybatis в основном фиксирована, а это означает, что он будет иметь только эти суждения if-else и не будет добавляться или изменяться. Если вам нужно устранить if-else, вы можете сделать это, вот псевдокод

Этот способ называется«Метод справочной таблицы», который устраняет переходы if-else за счет реализации фабрики политик. Наконец, слишком подробный дизайн Mybatis здесь повторяться не будет.Заинтересованные друзья могут пойти и скачать исходный код

На этом этапе некоторые читатели могут увидеть проблему,Даже если шаблон стратегии устраняет «если-иначе», если добавляется новый класс стратегии, не будет ли он по-прежнему нарушать принцип «открыто-закрыто»?

Правильно, потому что сам Mybatis не вводит зависимости Spring,Так что нет возможности реализовать принцип открыто-закрыто с помощью контейнера IOC. Spring 是一种开闭原则解决方式,那还有没有别的解决方式?

Решений много, суть принципа открыто-закрытоБлизко к исходной модификации кода, открыт для нового кода. Вы можете просмотреть пользовательские аннотации в указанном пакете или использовать instanceof, чтобы определить, наследуется ли он от интерфейса. Однако, если проект использует Spring, он все равно остановится.

Вывод

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

Суть шаблона стратегии по-прежнему заключается в отделении дизайна кода.По трем типам ролей в шаблоне стратегии: абстрактный интерфейс стратегии, политика и конкретный класс реализации фабрики стратегий. Благодаря детальным политикам для достижения основного класса, чтобы избежать чрезмерного количества кода, снизить сложность дизайна

Автор слышал, что многие мелкие партнеры думают, что то, что они делают, — это CRUD-работа, а не сложная и скучная. Собственно, что я хочу сказать:Бизнес-код такой же потрясающий, и он может отражать уровень программистов.. Не обязательно высокий параллелизм, большие данные и другие сценарии. Какой смысл подметать мир, не подметая дом

И последний вопрос:Когда появляется код if-else, нужно ли использовать режим стратегии для его оптимизации?

Если if-else считает, что ветвей не так много, и фиксируетсяПоследующие новые филиалы, то мы полностьюУменьшить сложность программы можно нарисовав способ функции; не пытайтесь избавиться от оператора if-else, это просто имеет смысл. Более того, использование паттерна стратегии приведет к большему количеству классов, и нет необходимости вводить паттерн стратегии для небольшого числа ветвей суждения.

Эта статья посвящена шаблону разработки стратегии, и позже мы последовательно выведем фабрику, прототип, легковес и другие шаблоны;Если статья была вам полезна, то нажмите на поддержку, желаю вам добра.

Справочная статья

  • Красота шаблонов проектирования: шаблоны стратегии

Поиск в Wechat [круг интереса к исходному коду], подпишитесь на официальный аккаунт и ответьте 123, чтобы получить учебные материалы, такие как GO, Netty, Seata, SpringCloud Alibaba, спецификации разработки, сборник интервью, структуру данных и так далее!