자바에서의 상태 디자인 패턴

상태 디자인 패턴은 행위 디자인 패턴 중 하나입니다. 객체가 내부 상태에 따라 동작을 변경할 때 사용됩니다.

상태 디자인 패턴

객체의 동작을 상태에 따라 변경해야 할 때, 객체에 상태 변수를 가질 수 있습니다. 그런 다음 상태에 따라 다른 작업을 수행하기 위해 if-else 조건 블록을 사용합니다. 상태 디자인 패턴은 ContextState 구현을 통해 이를 체계적이고 느슨하게 결합된 방식으로 제공하는 데 사용됩니다. 상태 패턴 Context는 State의 구체적인 구현 중 하나에 대한 상태 참조를 가진 클래스입니다. Context는 처리를 위해 상태 객체로 요청을 전달합니다. 간단한 예를 통해 이를 이해해 봅시다. 간단한 버튼이 있는 TV 리모컨을 구현하려고 합니다. 상태가 ON이면 TV를 켜고, OFF이면 TV를 끕니다. 다음과 같이 if-else 조건을 사용하여 구현할 수 있습니다. TVRemoteBasic.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();
	}

}

알림: 클라이언트 코드에서는 원격 상태를 설정하는 데 사용할 구체적인 값을 알아야 합니다. 또한 상태의 수가 증가하면 구현과 클라이언트 코드 간의 강한 결합은 유지 및 확장하기가 매우 어려워집니다. 이제 위의 TV 원격 예제를 구현하기 위해 State 패턴을 사용할 것입니다.

State 디자인 패턴 인터페이스

우선적으로 다양한 구체적인 상태 및 컨텍스트 클래스에 의해 구현되어야 하는 메서드를 정의할 State 인터페이스를 만들 것입니다. State.java

package com.journaldev.design.state;

public interface State {

	public void doAction();
}

State 디자인 패턴 구체적인 상태 구현

우리의 예제에서는 TV를 켜는 상태와 끄는 상태 두 가지가 있을 수 있습니다. 따라서 이러한 동작에 대한 두 가지 구체적인 상태 구현을 만들 것입니다. 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도 State를 구현하고 현재 상태를 참조하여 요청을 상태 구현에 전달한다는 것입니다.

상태 디자인 패턴 테스트 프로그램

이제 TV 원격의 상태 패턴 구현을 테스트하기 위해 간단한 프로그램을 작성해 봅시다. 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 원격의 기본 구현과 동일합니다.

상태 디자인 패턴의 이점

State 패턴을 사용하여 다형적 행동을 구현하는 이점은 명확하게 나타납니다. 오류 가능성이 적고 추가적인 행동을 위해 더 많은 상태를 추가하기 매우 쉽습니다. 이로써 우리의 코드를 더 견고하고 유지보수 및 유연성이 용이하게 만듭니다. 또한 State 패턴은 이러한 시나리오에서 if-else 또는 switch-case 조건 논리를 피하는 데 도움이 되었습니다. State 패턴은 Strategy 패턴과 매우 유사합니다. Java에서 Strategy 패턴을 확인해보세요. 이것으로 Java에서의 State 디자인 패턴에 대한 설명이 끝났습니다. 좋아하셨으면 좋겠습니다.

Source:
https://www.digitalocean.com/community/tutorials/state-design-pattern-java