[GOF] 상태(State) 패턴
2024. 3. 18. 16:50ㆍ디자인패턴
1. State Pattern
- 상태 패턴은 객체가 특정 상태에 따라 행위를 달리하는 상황에서, 상태를 객체화 하여 상태가 행동을 할 수 있도록 위임하는 패턴
- 객체 상태를 클래스로 표현한 패턴
- State 인터페이스 : 상태를 추상화한 고수준 모듈
- ConcreteState : 구체적인 각각의 상태를 클래스로 표현. State 역할로 결정되는 인터페이스(API)를 구체적으로 표현
- Context : State를 이용하는 시스템. 시스템 상태를 나타내는 State 객체를 합성(composition)하여 가지고 있다.
interface AbstractState {
void requestHandle(Context cxt);
}
class ConcreteStateA implements AbstractState {
@Override
public void requestHandle(Context cxt) {}
}
class ConcreteStateB implements AbstractState {
@Override
public void requestHandle(Context cxt) {
// 상태에서 동작을 실행한 후 바로 다른 상태로 바꾸기도 함
// 예를 들어 전원 on 상태에서 끄기 동작을 실행한후 객체 상태를 전원 off로 변경 하듯이
cxt.setState(ConcreteStateC.getInstance());
}
}
class ConcreteStateC implements AbstractState {
@Override
public void requestHandle(Context cxt) {}
}
class Context {
AbstractState state; // composition
void setState(AbstractState state) {
this.state = state;
}
// 상태에 의존한 처리 메소드로서 state 객체에 처리를 위임함
void request() {
state.requestHandle(this);
}
}
class Client {
public static void main(String[] args) {
Context context = new Context();
// 1. StateA 상태 설정
context.setState(new ConcreteStateA());
// 2. 현재 StateA 상태에 맞는 메소드 실행
context.request();
// 3. StateB 상태 설정
context.setState(new ConcreteStateB());
// 4. StateB 상태에서 또다른 StateC 상태로 변경
context.request();
// 5. StateC 상태에 맞는 메소드 실행
context.request();
}
}
2. 전략 패턴과 상태 패턴의 차이점
- 전략 패턴과 상태 패턴의 구조는 거의 같지만 어떤 목적을 위해서 사용되는가에 따라 차이가 있다.
- 전략 패턴은 알고리즘을 객체화 하여 클라이언트에서 유연적으로 전략을 제공 / 교체 한다.
- 상태 패턴은 객체의 상태를 객체화 하여 클라이언트와 상태 클래스 내부에서 다른 상태로 교체를 한다.
- 전략 패턴의 객체는 그 전략만의 알고리즘 동작을 정의 및 수행한다.
- 상태 패턴은 상태가 적용된 대상 객체가 할수있는 일련의 모든 행동들을 정의 및 수행한다.
- 전략 패턴의 전략 객체는 입력값에 따라 전략 형태가 다양하게 될 수 있으니 인스턴스로 구성한다.
- 상태 패턴의 상태 객체는 정의된 상태를 서로 스위칭 하기에 메모리 절약을 위해 싱글톤으로 구성한다.
'디자인패턴' 카테고리의 다른 글
[GOF] 추상 팩토리 패턴 (0) | 2024.04.02 |
---|---|
[GOF] 템플릿 메소드 패턴 (0) | 2024.03.19 |
[GOF] 전략(Strategy) 패턴 (0) | 2024.03.17 |
[GOF] 싱글톤(Singleton) 패턴 (1) | 2024.03.16 |