[디자인 패턴] 스테이트 패턴

[원본 링크]

스테이트(state) 패턴은 말 그대로 상태에 대한 패턴이다.
특정 조건에 따라서 객체의 상태가 바뀌도록 하고, 각 상태에 대한 행동을 인터페이스를 두고 별개의 클래스로 구현해서 집어넣는 것이다.

상태값을 열거체로 저장하고 길디긴 if-else등으로 뭉쳐놓는 것보다 훨씬 깔끔하고 수정&확장도 용이한 방법이다.

코드를 보는 편이 이해가 빠를 것이다.
A와 B, C, 3가지의 상태를 갖는 ABC라는 장치가 있다고 치자. 이건 각 상태마다 다른 출력을 뱉는다. 그리고 상태는 랜덤으로 계속 바뀐다.
ABC의 출력함수는 callFoo와 callBar 두가지. image

image 상태를 바꾸는 것에 대한 부분 말고 실질적인 행동은 전부 IState에 떠넘기는걸 볼 수 있다.

이제 그 행동을 보자. image

image 상태 인터페이스다.

그리고 A, B, C를 대강 구현해준다.
출력하는 텍스트만 조금 다르다. image

image

image

image

사용례다. image

image 잘 바뀌는걸 볼 수 있다.


일련의 행동을 인터페이스화해서 클래스로 구현한단 점은 스트래티지 패턴과 유사한 편이다.

하지만 스테이트 패턴은 확장성을 꾀하는 스트래티지와 다르게 상태를 실행 중에도 적극적으로 바꾸는 것에 주 목적이 있단 점이 다르다.

그리고 스트래티지 패턴은 주로 외부, 클라이언트에서 행동 클래스를 주입하지만.
스테이트 패턴은 클래스 내부에서 행동 클래스를 바꿔가며 알아서 잘 동작한다.


참조
헤드퍼스트 디자인 패턴