[Design Pattern]상태 패턴

디자인 패턴의 상태 패턴 정리

State

내부 상태를 바꿈으로써 객체에서 행동을 바꾸는 것을 도와줌

스테이트 패턴을 이용하면 객체의 내부 상태가 바뀜에 따라서 객체의 행동을 바꿀 수 있다. 마치 객체의 클래스가 바뀌는 것과 같은 결과를 얻을 수 있다.
  • 상태를 별도의 클래스로 캡슐화한 다음 현재 상태를 나타내는 객체에게 행동을 위임
    • 내부 상태가 바뀜에 따라서 행동이 달라지게 된다
  • 구성을 통해서 여러 상태 객체를 바꿔가면서 사용하기 때문에 클래스가 바뀌는 것 같은 결과를 얻는다

state

state

상태 패턴 vs 전략 패턴

  • 다이어그램 동일

상태 패턴

  • 상태 객체에 일련의 행동이 캡슐화됨
  • 상황에 따라 Context 객체에서 여러 상태 객체 중 한 객체에게 모든 행동을 위임
  • 클라이언트는 상태 객체에 대해서 거의 아무것도 몰라도 됨
  • 수많은 조건문을 집어넣는 대신에 사용할 수 있는 패턴
  • 행동을 객체 내에 캡슐화시키면 컨텍스트 내의 상태 객체를 바꾸는 것만으로도 컨텍스트 객체의 행동을 바꿀 수 있음
  • Context 객체를 생성할 때 초기 상태를 지정해주는 경우는 있지만, 그 후로는 그 Context 객체가 알아서 자기 상태를 변경

전략 패턴

  • 일반적으로 클라이언트에서 컨텍스트 객체한테 어떤 전략 객체를 사용할지를 지정해줌
  • 보통 가장 적합한 전략 객체를 선택해서 사용
  • 서브클래스를 만드는 방법을 대신하여 유연성을 극대화하기 위한 용도
  • 전략 패턴을 사용하면 구성을 통해 행동을 정의하는 객체를 유연하게 변경 가능
  • 어떤 클래스의 인스턴스를 만들고 그 인스턴스에게 어떤 행동을 구현하는 전략 객체를 건네 줌

핵심 정리

  • 스테이트 패턴을 이용하면 내부 상태를 바탕으로 여러 가지 서로 다른 행동을 사용할 수 있다.
  • 프로시저형 상태 기계를 쓸 때와는 달리 각 상태를 클래스를 이용해 표현하게 된다.
  • Context 객체에서는 현재 상태에게 행동을 위임한다.
  • 각 상태를 클래스로 캡슐화함으로써 나중에 변경시켜야 하는 내용을 국지화할 수 있다.
  • 스테이트 패턴과 스트래티지 패턴의 클래스 다이어그램을 똑같지만 그용도는 서로 다르다
  • 스트래티지 패턴에서는 일반적으로 행동 또는 알고리즘을 Context 클래스를 만들 때 설정한다.
  • 스테이트 패턴을 이용하면 Context의 내부 상태가 바뀜에 따라 알아서 행동을 바꿀 수 있도록 할 수 있다.
  • 상태 전환은 State 클래스에 의해서 제어할 수도 있고, Context 클래스에 의해서 제어할 수도 있다.
  • 스테이트 패턴을 이용하면 보통 디자인에 필요한 클래스의 개수가 늘어난다.
  • State 클래스를 여러 Context 객체의 인스턴스에서 공유하도록 디자인할 수도 있다.