Поиск по сайту:

Шаблон проектирования состояния в Java


Паттерн проектирования состояния является одним из шаблонов поведенческого проектирования. Шаблон проектирования состояния используется, когда объект меняет свое поведение в зависимости от своего внутреннего состояния.

Государственный шаблон проектирования

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();
	}

}

Обратите внимание, что клиентский код должен знать конкретные значения, используемые для установки состояния удаленного доступа. Более того, если количество состояний увеличится, то тесную связь между реализацией и клиентским кодом будет очень сложно поддерживать и расширять. Теперь мы будем использовать шаблон State для реализации приведенного выше примера TV Remote.

Интерфейс шаблона проектирования состояний

Прежде всего, мы создадим интерфейс состояния, который будет определять метод, который должен быть реализован различными конкретными состояниями и классом контекста. State.java

package com.journaldev.design.state;

public interface State {

	public void doAction();
}

Шаблон проектирования состояний Конкретные реализации состояний

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

package com.journaldev.design.state;

public class TVStartState implements State {

	@Override
	public void doAction() {
		System.out.println("TV is turned ON");
	}

}

TVStopState.java

package com.journaldev.design.state;

public class TVStopState implements State {

	@Override
	public void doAction() {
		System.out.println("TV is turned OFF");
	}

}

Теперь мы готовы реализовать наш объект Context, который изменит свое поведение в зависимости от своего внутреннего состояния.

Реализация контекста шаблона проектирования состояний

TVContext.java

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();
	}

}

Обратите внимание, что Context также реализует состояние и сохраняет ссылку на свое текущее состояние и перенаправляет запрос в реализацию состояния.

Программа испытаний государственного образца проектирования

Теперь давайте напишем простую программу для проверки нашей реализации шаблона состояния TV Remote. TVRemote.java

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();
		
	}

}

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

Преимущества шаблона проектирования состояний

Преимущества использования шаблона состояния для реализации полиморфного поведения очевидны. Вероятность ошибки меньше, и очень легко добавить больше состояний для дополнительного поведения. Это делает наш код более надежным, легко поддерживаемым и гибким. Кроме того, шаблон состояния помог избежать условной логики if-else или switch-case в этом сценарии. Шаблон состояния очень похож на шаблон стратегии, ознакомьтесь с шаблоном стратегии в Java. Это все, что касается шаблона проектирования State в Java, надеюсь, вам понравилось.