Чтобы правильно использовать государственные и шаблоны политики в приложениях Java, разработчики должны четко знать разницу между двумя шаблонами. Хотя структура режимов состояния и режимов политики очень похожа, они также следуют принципу открытия и закрытия, представляя «O» принцип твердого дизайна, их намерения совершенно разные. Схема политики в Java заключается в том, чтобы инкапсулировать набор связанных алгоритмов, предоставляя абонентам гибкость времени выполнения. Вызывающий абонент может выбрать разные алгоритмы во время выполнения, не изменяя класс контекста, используя политику. Классические примеры использования шаблонов политики включают реализацию алгоритмов шифрования, алгоритмы сжатия и алгоритмы сортировки. С другой стороны, режим состояния использует объект, чтобы показать различные поведения в разных состояниях. Объекты в реальном мире также имеют государства, и они будут вести себя по -разному в соответствии с их государствами. Например, торговый автомат может продавать только товары в штате Hascoin. Если вы не вполняете монеты, он не будет продавать товары. Теперь вы можете четко увидеть разницу между режимом политики и режимом состояния, их цель отличается. Режим состояния помогает объекту управлять своим состоянием, в то время как политический режим позволяет клиентам выбирать различное поведение. Другое отличие, которое нелегко увидеть, это то, кто движет изменениями поведения. В режиме политики он управляется клиентом, который предоставляет различные политики для контекстной информации. В режиме штата миграция состояния управляется контекстом или самим объектом состояния. Точно так же, если вы изменяете состояние в объекте состояния, оно должно соблюдать ссылку на контекст, что означает, что для торгового компьютера он может вызвать метод SetState для изменения текущего состояния контекста. С другой стороны, объект политики не содержит ссылки на контекст, и его клиент передает выбранную политику в контекст. Стратегия и шаблоны состояния - самые простые вопросы интервью о моделях проектирования Java. В этой статье о шаблонах дизайна Java мы подробно расскажем об этом. Мы рассмотрим сходства и различия между двумя режимами, которые помогут улучшить ваше понимание двух режимов.
Сходство между режимом штата и режимом политики:
Если вы посмотрите на графики UML шаблонов политики и шаблонов состояний, они выглядят очень похожими. В режиме состояния объект, который использует объект состояния для изменения поведения, называется объектом контекста. Точно так же в режиме стратегии объект, который использует объект стратегии для изменения поведения, также является объектом контекста. Помните, что клиент взаимодействует с объектом контекста. В режиме состояния контекст прокси метод вызовы объекта состояния. Текущий объект в контексте - это конкретный объект состояния. В политическом режиме контекст управляет также объектом политики. Этот объект либо передается как параметр, либо предоставляется при создании объекта контекста.
Давайте посмотрим на некоторые сходства между этими двумя основными образцами дизайна Java:
Как режим состояния, так и режим политики легко добавлять новые состояния или политики, не влияя на их использование оба, следуя принципу проектирования открытия и закрытия, что означает, что ваш дизайн открыт для расширений и закрыт для модификаций. В этих двух режимах контекст закрыт для модификации и добавляет новое состояние или политику. Вам не нужно изменять контекстный объект в других состояниях или требовать только небольших изменений. Подобно тому, как объект контекста в режиме состояния будет иметь начальное состояние, контекст в режиме политики обычно также имеет политику по умолчанию.
Режим состояния инкапсулирует различные поведения на пути разных объектов состояния, в то время как режим политики инкапсулирует различные поведения на пути различных объектов политики.
Оба шаблона основаны на конкретных подклассах для достижения конкретного поведения. Каждая конкретная политика распространяется на класс абстрактного политики, и каждое состояние также является интерфейсом, используемым для представления состояний или подкласса абстрактного класса.
Экземпляр режима состояния
открытый класс WindowState {Private String StateValue; Public WindowState (String StateValue) {this.stateValue = stateValue; } public String getStateValue () {return stateValue; } public void setStateValue (String atationValue) {this.stateValue = stateValue; } public void handle () { /** выполнять разные операции в соответствии с разными состояниями, а затем переключить состояние* / if ("window" .equals (statevalue)) {switchWindow (); this.statevalue = "полный экран"; } else if ("fullScreen" .equals (statevalue)) {switchfullScreen (); this.statevalue = "window"; }} private void switchwindow () {System.out.println ("Переключение в состояние окна"); } private void switchfullScreen () {System.out.println ("Переключение на полноэкранное состояние"); }} / *** Использование состояния*/ public Class WindowContext {private WindowState State; public WindowContext (состояние WindowState) {this.state = state; } public windowstate getState () {return State; } public void setState (состояние WindowState) {this.state = state; } public void switchState () {this.state.handle (); }} /* * State (State) mode behavioral mode* Changes both the state of the object and the behavior of the object* According to the state, change the behavior*/ public class Test { public static void main(String[] args) { /* * There are only two state values in this example, which are controlled by the state class itself* You can also control the state value and hand over the client to set */ WindowContext context = new WindowContext(new WindowState("Window")); context.switchstate (); context.switchstate (); context.switchstate (); context.switchstate (); context.switchstate (); context.switchstate (); }}Печать
Переключитесь на состояние окна на полное состояние экрана в состояние окна в полное состояние экрана
Пример режима политики
/ *** Продвижение продукта* Эта категория: Коллекция денежных средств*/ public interface icashsuper {double acceptcash (двойные деньги); } / ** * Нормальная коллекция денежных средств * @author stone * */ public class cashnormal реализует icashsuper {@override public doublecash (Double Money) {return Money; }} / ** * Денежные средства собираются на скидках * @author Stone * */ public Class CashRebate реализует Icashsuper {частная двойная скидка; // дисконтирование публичного касо -касеса (двойная скидка) {this.rebate = скидка; } @Override public Double AcceptCash (Double Money) {return new BigDecimal (деньги * скидка / 10) .setscale (2, bigdecimal.round_half_up) .doublevalue (); }} / ** * Скидка наличными с наличными * @author Stone * */ Public Class Cashreturn реализует Icashsuper {Private Double MoneyCondition; // Минимальная сумма Cashback Private Double Returnmoney; // return utment public cashreturn (Double MoneyCondition, Double returnmoney) {this.moneyCondition = MoneyCondition; this.returnmoney = returnmoney; } @Override public Double AcceptCash (Double Money) {// Несколько скидок if (money> = moneycondition) {return money - math.floor (money/moneycondition) * returnmoney; } else {return money; }}} / *** Выполнить соответствующее поведение на основе принятого класса политики*/ public Class CashContext {Private Icashsuper Casher; public cassContext () {} public cashContext (iCashsuper casher) {this.casher = casher; } public void setCasher (icashsuper casher) {this.casher = casher; } // Согласно конкретному объекту политики, алгоритм поведение называть его публичным Doublecash (Double Money) {return this.casher.acceptcash (money); }} открытый тест класса {public static void main (String [] args) {Double Money = 998; // оригинальная цена CashContext CashContext = новый CashContext (новый Cashnormal ()); System.out.println («Оригинальная цена:» + cashcontext.acceptcash (money)); // Общая стратегия CashContext.SetCasher (новый касо -кассе (8,5)); System.out.println ("85% скидка:" + cashcontext.acceptcash (деньги)); // Стратегия дисконтирования 85% от CassContext.SetCasher (новый кассовый (300, 50)); System.out.println («Возврат 50, если более 300:» + cashcontext.acceptcash (деньги)); // Стратегия кешбэка 50, если более 300}}Печать
Оригинальная цена: 998,0 85% скидка: 848,3 скидка на 50: 848,0 старше 300
Разница между режимом политики и режимом состояния
Мы узнали, что эти два шаблона очень похожи по структуре, но у них все еще есть разные части. Давайте посмотрим на некоторые ключевые различия между ними.
Это все различия между моделями политики и моделями состояния в Java. Как я уже сказал, они выглядят очень похожими на диаграммах UML, оба следуют принципу открытия, закрытия и инкапсулирования поведения. Режим политики используется для инкапсуляции алгоритмов или политик. Он будет предоставлен объекту контекста в качестве параметра или комбинированного объекта во время выполнения, в то время как режим состояния используется для управления миграцией состояния.