상태 패턴(State Pattern)은 객체의 상태에 따라 그 객체의 행동을 변경하는 디자인 패턴이다. 객체를 다루다보면 현재 상태에 따른 행동을 하면서도 상태가 동적으로 계속해서 바뀌는 상황이 발생한다. 만약 이를 간단하게 풀어낸다면 아래와 같을 것이다.
if(상태 == 1){
...
상태 2로 변경한다.
}else if(상태 == 2){
...
상태 3으로 변경한다.
}else if(상태 == 3){
...
상태 1로 변경한다.
}
물론 정말 실전에서 사용될만큼 규모가 커진다면 상태에 따라 처리되어야 하는 것도 많아지고 훨씬 복잡한 상태가 엮여있는 상황이 발생한다. 여기서 더 큰 문제는 새로운 상태가 추가될 때마다 하나씩 추가하게 되면서 코드가 더 비대해지는 문제가 발생하는 것이다.
위와 같은 상황에서 스테이트 패턴은 상태를 추상화하여 행동에 따라 상태마다의 행동을 구현하게 만든다. 그리고 상태를 가지는 객체 (Context라 부른다.)는 현재 상태 정보를 가지면서 행동을 하기 위해서 현재 상태에 대한 행동 메서드를 호출한다.
interface State{
void a(Context c);
void b(Context c);
}
class OneState implements State{
void a(Context c){
.. 작업 처리
c.setState(new TwoState());
}
void b(Context c){
.. 작업 처리
.. 해당 메서드에서 OneState 상태는 유지한다.
}
}
class TwoState implements State{
void a(Context c){
.. 작업 처리
.. 해당 메서드에서 TwoState 상태는 유지한다.
}
void b(Context c){
.. 작업 처리
c.setState(new OneState());
}
}
class Context{
State state;
void setState(State state){
this.state = state;
}
void a(){
state.a(this);
}
void b(){
state.b(this);
}
}
결과적으로 Context는 상태 하나만을 가지고 간단히 상태에 따른 행동을 요청하는 것을 쉽게 파악할 수 있다. 상태들은 서로의 연관관계에 맞게 상태를 전환해주어 Context 객체가 자연스럽게 상태를 동적으로 변환해가는 것을 볼 수 있다.
여기에 만약 성능을 더 올려주고 싶다면, 상태 객체를 싱글턴으로 사용하여 불필요한 생성 비용을 줄여볼 수 있다.
'디자인패턴' 카테고리의 다른 글
디자인 패턴 - 옵저버 패턴 (1) | 2024.12.02 |
---|---|
디자인 패턴 - 커맨드 패턴 (0) | 2024.11.29 |
디자인 패턴 - 전략 패턴 (0) | 2024.11.27 |
디자인 패턴 - SOLID 패턴 SRP (0) | 2024.11.26 |
댓글