스테이트 패턴(State Pattern) Design Patterns

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 객체에서 여러 상태 객체 중 한 객체에게 모든 행동을 맡기게 된다. 그 객체의 내부 상태에 따라 현재 상태를 나나태는 객체가 바뀌게 되고, 그 결과로 컨텍스트 객체의 행동도 자연스럽게 바뀌게 된다.
클라이언트는 상태 객체에 대해서 거의 아무것도 몰라도 된다.
 
하지만 스크래티지 패턴을 사용할 때는 일반적으로 클라이언트에서 켄텍스트 객체한테 어떤 전략 객체를 사용할지를 지정해 준다. 스트래티지 패턴은 주로 실행시에 전략 객체를 변경할 수 있는 유연성을 제공하기 위한 용도로 쓰인다. 보통 가장 적합한 전략 객체를 선택해서 사용하게 된다.
 
스트래티지 패턴
 : 구성을 통해 행동을 정의하는 객체를 유연하게 바꿀 수 있다.
 
스테이트 패턴
 : 켄텍스트 객체에 수많은 조건문을 집어넣는 대신 사용. 행동을 상태 객체 내에 캡슐화시키면 컨텍스트 내의 상태 객체를 바꾸는 것만으로 컨텍스트 객체의 행동을 바꿀 수 있다.

덧글

  • 강지행 2006/08/01 21:16 # 삭제 답글

    스태이트 패턴 공부하다가 링크타고 왔어요~ 오~~~ 역쉬~~
    잘 보구가요^^*
    패턴.. 어려워요.T.T
  • 이종화 2006/08/02 09:06 # 답글

    여기서도 만나네요? ^^/
    패턴 공부가 어렵다기 보다 적절하게 활용하고 착안하는게 힘든것 같아요.
    미리 패턴을 수립하고 프로그래밍 하는 경우보다 지나고 깨닫는 경우가 많아서 그런것 같네요.
    지행씨가 덧글을 남겨줘서 나도 오랜만에 스태이트 패턴을 다시 볼 수 있어서 좋네요. 그럼 또 봐요~!
  • 주우영 2012/03/05 22:25 # 삭제 답글

    좋은 자료 감사합니다. 패턴은 소스를 짜고난다음 후에 적용하는 일이 많은것 같습니다. 즉 리펙토링을 통해서 말이죠.. 그래서 소스를 짜고 난다음 그걸로 끝이아닌 후에 내가짠 소스를 리딩해보는 작업이 꼭 필요한것 같습니다. 회사에 자산이 되는 소스를 남기는 건 문론이고 스스로 디자인패턴을 공부할 수 있도록 말입니다.
  • sunu 2012/12/10 16:17 # 삭제 답글

    그냥 요새 방통대 다니느라고 .과제 하다가 .ㅋㅋㅋ 종화 님 블로그를 방문하게될줄이야 .ㅋㅋㄷㅋㄷㅋㄷㅋㄷㅋㄷㅋㄷㅋㄷ
댓글 입력 영역