Автор оригинала: Pankaj Kumar.
Шаблон проектирования состояния является одним из шаблонов поведенческого проектирования. Шаблон проектирования состояния используется, когда объект изменяет свое поведение в зависимости от своего внутреннего состояния.
Шаблон Проектирования Состояния
Если нам нужно изменить поведение объекта в зависимости от его состояния, у нас может быть переменная состояния в объекте. Затем используйте блок if-else условие для выполнения различных действий в зависимости от состояния. Шаблон проектирования состояния используется для обеспечения систематического и слабо связанного способа достижения этой цели с помощью Контекста
и состояния
реализаций.
Шаблон состояния Контекст – это класс, который имеет ссылку на состояние одной из конкретных реализаций состояния. Контекст пересылает запрос объекту состояния для обработки. Давайте разберемся в этом на простом примере.
Предположим, мы хотим реализовать пульт дистанционного управления телевизором с простой кнопкой для выполнения действия. Если состояние ВКЛЮЧЕНО, он включит телевизор, а если состояние ВЫКЛЮЧЕНО, он выключит телевизор.
Мы можем реализовать это, используя условие if-else, как показано ниже;
Мы можем реализовать это, используя условие if-else, как показано ниже;
package com.journaldev.design.state; public class TVRemoteBasic { private String state=""; public void setState(String state){ this.state=state; } public void doAction(){ if(state.equalsIgnoreCase("ON")){ System.out.println("TV is turned ON"); }else if(state.equalsIgnoreCase("OFF")){ System.out.println("TV is turned OFF"); } } public static void main(String args[]){ TVRemoteBasic remote = new TVRemoteBasic(); remote.setState("ON"); remote.doAction(); remote.setState("OFF"); remote.doAction(); } }
Обратите внимание, что клиентский код должен знать конкретные значения, которые следует использовать для настройки состояния удаленного доступа. Кроме того, если количество состояний увеличится, то тесную связь между реализацией и клиентским кодом будет очень трудно поддерживать и расширять.
Теперь мы будем использовать шаблон состояния для реализации приведенного выше примера удаленного телевизора.
Интерфейс Шаблона проектирования состояний
Прежде всего, мы создадим интерфейс состояний, который определит метод, который должен быть реализован различными конкретными состояниями и контекстным классом.
Прежде всего, мы создадим интерфейс состояний, который определит метод, который должен быть реализован различными конкретными состояниями и контекстным классом.
package com.journaldev.design.state; public interface State { public void doAction(); }
Шаблон Проектирования Состояния Конкретные Реализации Состояния
В нашем примере у нас может быть два состояния – одно для включения телевизора, а другое для его выключения. Поэтому мы создадим две конкретные реализации состояний для такого поведения.
В нашем примере у нас может быть два состояния – одно для включения телевизора, а другое для его выключения. Поэтому мы создадим две конкретные реализации состояний для такого поведения.
package com.journaldev.design.state; public class TVStartState implements State { @Override public void doAction() { System.out.println("TV is turned ON"); } }
В нашем примере у нас может быть два состояния – одно для включения телевизора, а другое для его выключения. Поэтому мы создадим две конкретные реализации состояний для такого поведения.
package com.journaldev.design.state; public class TVStopState implements State { @Override public void doAction() { System.out.println("TV is turned OFF"); } }
Теперь мы готовы реализовать наш контекстный объект, который изменит свое поведение в зависимости от своего внутреннего состояния.
Реализация Контекста Шаблона Проектирования состояния
Реализация Контекста Шаблона Проектирования состояния
package com.journaldev.design.state; public class TVContext implements State { private State tvState; public void setState(State state) { this.tvState=state; } public State getState() { return this.tvState; } @Override public void doAction() { this.tvState.doAction(); } }
Обратите внимание, что Контекст также реализует состояние, сохраняет ссылку на его текущее состояние и перенаправляет запрос на реализацию состояния.
Государственная Программа Тестирования Шаблонов Проектирования
Теперь давайте напишем простую программу для тестирования нашей реализации шаблона состояния пульта дистанционного управления телевизором.
Теперь давайте напишем простую программу для тестирования нашей реализации шаблона состояния пульта дистанционного управления телевизором.
package com.journaldev.design.state; public class TVRemote { public static void main(String[] args) { TVContext context = new TVContext(); State tvStartState = new TVStartState(); State tvStopState = new TVStopState(); context.setState(tvStartState); context.doAction(); context.setState(tvStopState); context.doAction(); } }
Вывод вышеуказанной программы такой же, как и при базовой реализации телевизионного пульта дистанционного управления без использования шаблона состояния.
Преимущества государственного Образца Проектирования
Преимущества использования шаблона состояния для реализации полиморфного поведения хорошо видны. Вероятность ошибки меньше, и очень легко добавить больше состояний для дополнительного поведения. Таким образом, наш код становится более надежным, легко ремонтопригодным и гибким. Также шаблон состояния помог избежать условной логики if-else или switch-case в этом сценарии.
Шаблон состояния очень похож на шаблон стратегии, проверьте Шаблон стратегии в Java .
Это все для шаблона проектирования состояния в java, надеюсь, вам понравилось.