반응형

상태 패턴(State Pattern)

 

스테이트 패턴은 객체가 특정 상태에 따라 행위를 달리하는 상황에서

자신이 직접 상태를 체크하여 상태에 따라 행위를 호출하지 않고

상태를 객체화하여 상태가 행동을 할 수 있도록 위임하는 패턴이다.

 

즉, 객체의 특정 상태를 클래스로 선언하고,

클래스에서는 해당 상스테이트 패턴은 객체가 특정 상태에 따라 행위를 달리하는 상황에서,

자신이 직접 상태를 체크하여 상태에 따라 행위를 호출하지 않고,

상태를 객체화 하여 상태가 행동을 할 수 있도록 위임하는 패턴을 말합니다.

 

즉, 객체의 특정 상태를 클래스로 선언하고, 클래스에서는 해당 상태에서 할 수 있는 행위들을 메서드로 정의한다.
그리고 이러한 각 상태 클래스들을 인터페이스로 캡슐화 하여, 클라이언트에서 인터페이스를 호출하는 방식을 말한다.

상태에 기반한 behavior object를 만들 때 이용하고 State machine diagram을 쓸 때 만드는 패턴이다.

 

쓰는 시점은, 기존 State machine diagram을 개선하기 힘든 경우에 쓰이고

이때 상속 보다는 객체의 합성을 더 선호하라는 디자인 원칙이 이용된다.

 

 

 

상태 패턴 클래스 다이어그램

 

 

하나의 클래스에서 상태, 행동을 모두 정의하는 것이 아닌

 

인터페이스로 상태에 따른 행동을 정의해주고

 

다른 클래스에서는 상태를 객체화하여 상태가 행동 할 수 있도록 위임 해준다.

 

 

HandState 인터페이스

상태에 대한 행동을 정의해준다.

package StatePattern;

public interface HandState {
	public String getState();
}

 

Rock, Scissors, Paper 클래스

HandState를 직접 구현하는 클래스로 상태에 대한 행동을 구체화한다.

package StatePattern;

public class Rock implements HandState{
	@Override
	public String getState() {
		return "바위";
	}
}
package StatePattern;

public class Scissors implements HandState{
	@Override
	public String getState() {
		return "가위";
	}
}
package StatePattern;

public class Paper implements HandState{
	@Override
	public String getState() {
		return "보";
	}
}

 

Person 클래스

Person의 상태를 set, get해준다.

package StatePattern;

public class Person {
	private HandState handState;
	
	public Person() {
		handState = new Rock();
	}
	
	public void setState(HandState handState) {
		this.handState = handState;
	}
	
	public String getState() {
		return handState.getState();
	}
}

 

StateMain 클래스

상태를 객체화 하여 행동을 위임하고 있는 것을 볼 수 있다.

package StatePattern;

public class StateMain {
	public static void main(String[] args) {
		Person person = new Person();		
		System.out.println(person.getState());
		
		person.setState(new Scissors());
		System.out.println(person.getState());
		
		person.setState(new Paper());
		System.out.println(person.getState());
	}
}

 

바위
가위

 

 

정리

 

상태 패턴은 내부 상태 객체들이 캡슐화되어 외부에서 전혀 알 수 없게되고,

외부에서는 Context 객체의 각 Action들을 호출하기만 할 뿐이다.

이를 통해 Decoupling을 하여 코드의 수정 및 확장을 용이하게 한다.

 

https://victorydntmd.tistory.com/294

반응형