웹사이트 검색

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 인터페이스를 생성합니다. 상태.자바

package com.journaldev.design.state;

public interface State {

	public void doAction();
}

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

이 예에서는 두 가지 상태를 가질 수 있습니다. 하나는 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 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 조건 논리를 피하는 데 도움이 되었습니다. State Pattern은 Strategy Pattern과 매우 유사합니다. Java의 Strategy Pattern을 확인하세요. 이것이 Java의 상태 디자인 패턴에 대한 전부입니다. 마음에 드셨기를 바랍니다.