Определение: Определите набор алгоритмов, инкапсулируйте каждый алгоритм и сделайте их взаимозаменяемыми.
Тип: поведенческий паттерн
Классовая диаграмма:
Схема политики представляет собой инкапсуляцию алгоритмов, инкапсулирующих серию алгоритмов в соответствующие классы, и эти классы реализуют один и тот же интерфейс и могут быть заменены друг другом. В режиме поведенческого класса, упомянутом выше, существует шаблон, который также фокусируется на инкапсуляции алгоритма - режима метода шаблона. По сравнению с диаграммой классов вы можете увидеть, что разница между режимом политики и режимом метода шаблона заключается только в том, что существует отдельный контекст класса инкапсуляции. Разница между ним и режимом метода шаблона состоит в том, что в режиме метода шаблона основной корпус алгоритма вызывающего призвания находится в абстрактном родительском классе, в то время как в режиме стратегии основной корпус алгоритма вызывающего средства заключается в контексте класса инкапсуляции. Абстрактная стратегия стратегия, как правило, является интерфейсом, цель состоит только в том, чтобы определить спецификацию и, как правило, не содержит логики. На самом деле, это всего лишь общая реализация. В реальном программировании, поскольку между каждым конкретным классом реализации стратегии неизбежно есть такая же логика, чтобы избежать дубликата кода, мы часто используем абстрактные классы, чтобы играть роль стратегии и инкапсулировать общедоступный код. Следовательно, во многих сценариях применения тень шаблона метода шаблона обычно наблюдается в режиме стратегии.
Структура моделей политики
Класс инкапсуляций: также известный как контекст, вторичная инкапсуляция политики заключается в том, чтобы избежать прямых вызовов политики с помощью модулей высокого уровня.
Абстрактная стратегия: обычно интерфейс. Когда в каждом классе реализации существует дубликат логики, для инкапсуляции этой части общего кода используются абстрактные классы. В настоящее время шаблон политики больше похож на шаблон метода шаблона.
Конкретная стратегия: конкретные роли стратегии обычно выполняются набором классов, инкапсулированных в алгоритмы, и эти классы могут быть заменены свободно по мере необходимости.
Примеры сценариев применения:
Лю Бей собирается выйти замуж за свою жену в Цзяндонге. Перед отъездом Чжух Лян дал Чжао Юну (лучшему человеку) три хитрости, заявив, что это решит сложную проблему, разобрав ее в соответствии с секретом небес. Эй, скажем, это действительно решило большую проблему. В конце концов, Чжоу Ю сопровождал свою жену, а затем сломал свои войска. Давайте сначала посмотрим, как выглядит эта сцена.
Давайте впервые поговорим о элементах в этой сцене: три умных уловка, один умный трюк и один умный трюк. Умный трюк был дан братом Лян. Умный трюк обычно известен как умный трюк. Затем Чжао Юн - работник, который вынимает умный трюк, выполняет его, а затем выигрывает. Как выразить их с помощью Java -программ?
Давайте сначала посмотрим на картинку?
Три хитрости одинаковы, так что давайте напишем интерфейс:
пакет com.yangguangfu.strategy; /**** @author [email protected]: AFU* Сначала определите интерфейс стратегии, который является интерфейсом трех трюков, которые Zhuge Liang дал Чжао Юну. */public interface istrategy {// Каждый трюк - это исполняемый алгоритм. Public void Operate (); }
Затем напишите три класса реализации, есть три умных трюка:
Умный план: первое прибытие в Ву:
пакет com.yangguangfu.strategy; /**** @author [email protected]: A Fu* Попросите мистера Цяо, чтобы Sun Quan не мог убить Лю Бей. */ public Class Backdoor реализует istrategy {@override public void operate () {System.out.println («Ищу помощь старого Цяо Го, пусть Ву Гаотай оказывает давление на Сан Куан, чтобы Сан Куан не мог убить Лю Бей ...»); }}
Второй трюк: пожалуйста, дайте Wu Gootai зеленый свет и отпустите:
пакет com.yangguangfu.strategy; /**** @author [email protected]: A Fu* Пожалуйста, дайте Wu Gootai зеленый свет. */ public Class Givengreenlight реализует istrategy {@override public void operate () {System.out.println («Пожалуйста, дайте Wu Gootai зеленый свет, отпустите!»); }}
Навык 3: Миссис Сан отрезает заднюю часть и блокирует преследователей:
пакет com.yangguangfu.strategy; /**** @author [email protected]: afu* Миссис Сан отрезала заднюю часть и заблокировала преследователей. */ public Class Blackenemy реализует istrategy {@override public void operate () {System.out.println ("Mrs. Sun отрезает спину, блокирует преследователей ..."); }}
Хорошо, все, есть три хитрости, так что есть место, чтобы положить их в совет:
пакет com.yangguangfu.strategy; / ** * * @author [email protected]: afu * */ context public class {private istrategy стратегия; // Конструктор, какой улов, вы хотите использовать общественный контекст (стратегия Itstrategy) {this.strategy = стратегия; } public void Operate () {this.strategy.operate (); }}
Затем Чжао Юн с большой мужеством несла три совета, тянув старика Лю Бей, который уже вошел в ряды пожилых людей и хотел жениться на невинной девочке, пошел выйти замуж за свою жену. Привет, не говоря уже о том, что три трюки брата Ляна действительно хороши. Смотреть:
пакет com.yangguangfu.strategy; Общедоступный класс Zhaoyun { /*** Zhao Yun появился. Согласно объяснению ему, объяснив его, он разобрал трюки, в свою очередь*/ Public Static Void Main (String [] args) {контекст контекста; // Когда я впервые прибыл в WU, я разобрал первую систему.out.println ("-----------------------------------------"); контекст = новый контекст (new Backdoor ()); context.operate (); // execute system.out.println ("/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n"); //When Liu Bei was happy to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be Не желая не желать не желать не желать не желать не желать не желать не желать не желать не желать не желать не желать не желать нежелать разборку третьей системы. контекст = новый контекст (новый чернокожие ()); context.operate (); // разобрать и выполнять System.out.println ("/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N/N. /n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n /n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n /n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n
Преимущества и недостатки режима политики Основными преимуществами политического режима являются:
Классы политики могут быть свободно переключаться, и, поскольку классы политики реализуют ту же абстракцию, их можно свободно переключаться.
Легко расширить, добавить новую политику очень просто для модели политики, и она может быть расширена без изменения исходного кода.
Избегайте использования нескольких условий. Если вы не используете режим политики, для всех алгоритмов, для подключения должны использоваться условные утверждения, а также алгоритм, который будет использоваться посредством условного суждения. В предыдущей статье мы упомянули, что использование нескольких условных суждений очень трудно поддерживать.
Есть два основных недостатка модели стратегии:
Поддержание различных классов политики принесет дополнительные накладные расходы на развитие. У вас может быть опыт в этом отношении: вообще говоря, количество классов политики превышает 5, что более хлопотно.
Все классы политики должны быть подвержены воздействию клиента (вызывающего абонента), потому что клиент должен использовать клиент, поэтому клиент должен знать, какие есть политики, и понимать различия между различными политиками, в противном случае последствия являются серьезными. Например, существует стратегическая модель для сортировки алгоритмов, которые предоставляют три алгоритма: быстрая сортировка, сортировка пузырьков и выбор сортировки. До того, как клиент использует эти алгоритмы, должны ли он понять применение этих трех алгоритмов? Например, клиент должен использовать контейнер, который реализован связанными списками и массивами. Нужно ли клиент также понимать разницу между связанными списками и массивами? В связи с этим это противоречит законодательству Димитиан.
Применимые сценарии
При выполнении объектно-ориентированного дизайна вы должны быть очень знакомы с шаблоном политики, потому что он по существу наследование и полиморфизм в объектно-ориентированном. После прочтения общего кодекса шаблона политики, я думаю, что даже если я никогда раньше не слышал о шаблоне политики, я, должно быть, использовал его во время процесса разработки, верно? По крайней мере, в следующих двух ситуациях вы можете рассмотреть возможность использования модели стратегии.
Основная логика нескольких классов одинакова, и существуют только небольшие различия в алгоритме и поведении частичной логики.
Существует несколько аналогичных поведений или алгоритмов, и клиент должен динамически решить, какой из них использовать, чтобы вы могли использовать шаблон политики, чтобы инкапсулировать эти алгоритмы для клиента.
Стратегическая модель - это простая и обычно используемая модель. Когда мы развиваемся, мы часто используем его намеренно или непреднамеренно. Вообще говоря, модель стратегии не будет использоваться в одиночку, и более распространено использовать ее смешанным образом с режимом метода шаблона, заводским режимом и т. Д.