[디자인 패턴] 스테이트 패턴
스테이트(state) 패턴은 말 그대로 상태에 대한 패턴이다.
특정 조건에 따라서 객체의 상태가 바뀌도록 하고, 각 상태에 대한 행동을 인터페이스를 두고 별개의 클래스로 구현해서 집어넣는 것이다.
상태값을 열거체로 저장하고 길디긴 if-else등으로 뭉쳐놓는 것보다 훨씬 깔끔하고 수정&확장도 용이한 방법이다.
코드를 보는 편이 이해가 빠를 것이다.
A와 B, C, 3가지의 상태를 갖는 ABC라는 장치가 있다고 치자. 이건 각 상태마다 다른 출력을 뱉는다. 그리고 상태는 랜덤으로 계속 바뀐다.
ABC의 출력함수는 callFoo와 callBar 두가지.

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

상태 인터페이스다.
그리고 A, B, C를 대강 구현해준다.
출력하는 텍스트만 조금 다르다.




사용례다.

잘 바뀌는걸 볼 수 있다.
일련의 행동을 인터페이스화해서 클래스로 구현한단 점은 스트래티지 패턴과 유사한 편이다.
하지만 스테이트 패턴은 확장성을 꾀하는 스트래티지와 다르게 상태를 실행 중에도 적극적으로 바꾸는 것에 주 목적이 있단 점이 다르다.
그리고 스트래티지 패턴은 주로 외부, 클라이언트에서 행동 클래스를 주입하지만.
스테이트 패턴은 클래스 내부에서 행동 클래스를 바꿔가며 알아서 잘 동작한다.
참조
헤드퍼스트 디자인 패턴