×
Crocus
공부한 내용을 정리하는 블로그로 시작한
Crocus는 2014년 1월 14일 부터 시작하여
현재 월 6만명, 총 2,877,104명의 방문자 수를 기록하고 있습니다.
Donation
이제 많은 사용자들이 이용하는 만큼
더 다양한 서비스 개발/제공을 위해 후원금을 모금하고자 합니다.
후원을 해주시는 분들은 Donators 명단에 성명, 후원금을 기입해드리며
Crocus 블로그가 아닌 다른 곳에 정리해둔 저만의 내용을 공유해 드리고자 합니다.
Account
예금주 : 고관우
신한은행 : 110-334-866541
카카오뱅크 : 3333-01-7888060

👉 후원 페이지 바로가기 Donators
익명 : 5000원(Crocus응원합니다.)
busyhuman: 5000원(유용한 지식 감사합니다.)
익명 : 5000원(알고리즘 학습러)
반응형

상태 패턴(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

반응형