2009. 9. 18. 14:58
Programming/Design Pattern
State Pattern (Objects for States)
1. 컨텍스트
객체의 내부 상태가 변화될 때, 해당 객체의 행위를 수정하는 것을 가능하게 하기 위해 사용된다.
마치 객체의 클래스가 바뀌는 것과 같은 결과를 얻을 수 있다.
State 패턴은 상태(state)를 클래스로 표현한다. 현실세계에서 상태를 사물(object)로 보는 일은 거의 없기 때문에, 상태를 클래스로 표현하는 일은 어색할 수 있다. 그러나, 상태를 클래스로 표현하면 클래스의 교체를 통해서 ‘상태의 변화’를 나타낼 수 있고, 새로운 상태를 추가해야 하는 경우에는 무엇을 프로그램 하면 되는지 명확해진다.
2. 적용 영역
l 객체의 행위가 객체의 상태에 의존하고, 객체의 행위가 실행 시점에서의 객체의 상태에 따라 변화되어야 할 경우
l 오퍼레이션이 크고, 객체의 상태에 따라 다수의 조건문을 포함하는 경우
3. 구조

4. 적용 결과
l State 패턴은 특정 상태에 국한된 행위를 다른 상태들을 위한 행위와 구분하여 로컬화 한다.
l State 패턴은 명시적으로 상태 전이를 수행한다.
l State 객체는 공유될 수 있다.
5. 관련 패턴
l State 객체가 어떻게 공유되며, 언제 공유될 것인지는 Flyweight 패턴이 설명한다.
l State 객체는 종종 Singleton 형태를 띈다.
6. 스트래티지 패턴과 차이점
스트래티지 패턴과 유사한 다이어그램을 볼 수 있다. 하지만 이 두 패턴은 용도에서 차이가 있다.
스테이트 패턴을 사용할 때는 상태 객체에 일련의 행동이 캡슐화된다. 상황에 따라 Context 객체에서 여러 상태 객체 중 한 객체에게 모든 행동을 맡기게 된다. 그 객체의 내부 상태에 따라 현재 상태를 나나태는 객체가 바뀌게 되고, 그 결과로 컨텍스트 객체의 행동도 자연스럽게 바뀌게 된다.
클라이언트는 상태 객체에 대해서 거의 아무것도 몰라도 된다.
하지만 스크래티지 패턴을 사용할 때는 일반적으로 클라이언트에서 켄텍스트 객체한테 어떤 전략 객체를 사용할지를 지정해 준다. 스트래티지 패턴은 주로 실행시에 전략 객체를 변경할 수 있는 유연성을 제공하기 위한 용도로 쓰인다. 보통 가장 적합한 전략 객체를 선택해서 사용하게 된다.