상태(state) 패턴 한번 써 볼까?

일이 일이다 보니 상태(state)를 다룰 일이 아주 많습니다. 상태로 시작해 상태로 끝난다고 해도 과언이 아닐 정도지만, 패턴에 익숙하지 않아 그다지 쓰지 않다 보니 보통 그렇듯 간편하게(?) 상태 값으로 처리합니다. 이미 책과 인터넷에서 많이 찾아 볼 수 있는 내용이긴 하겠지만 상태 패턴을 한번 써 보기로 맘 먹은지라 기억도 되살릴겸 간단히 정리해 봅니다.

IMM Object State

IMM 객체 상태 도해인데 이게 뭔지는 중요하지 않으니 넘어갑니다. 중요한 것은 이 객체에 크게 IN SERVICE, NOT IN SERVICE로 두 가지 상태가 있고 NOT IN SERVICE에는 하위 상태인 EXTERNAL SELECT, INTERNAL SELECT 상태가 있다는 점입니다. 화살표는 상태 전이 경로를 나타냅니다. 정리하면 다음과 같습니다.

 From To
IN SERVICE EXTERNAL SELECT
IN SERVICE INTERNAL SELECT
EXTERNAL SELECT IN SERVICE
INTERNAL SELECT IN SERVICE

상태 패턴에서는 흔히 상태 값으로 나타내는 상태 하나하나를 모두 객체로 정의하며 상태 전이를 일으키는 방아쇠(trigger)를 메소드로  정의합니다. 그럼 실제로 구현하기 전에 일반적인 상태 패턴을 보겠습니다.

State Diagram

그림은 Head First Design Patterns에서 가져왔습니다. 간단히 설명하면 Context에서는 인터페이스인 State만 사용해 handle()을 호출하는데 실제 호출하는 handle()ConcreteStateA::handle() 또는 ConcreteStateB::handle()이 됩니다. 이는 당시 Context 상태 전이에 따라 처리합니다. 그럼 다시 처음 상태 도해를 바탕으로 클래스 도해를 만들어 봅니다.

IMM Class Diagram

이제 실제 코드 예를 보겠습니다. 먼저 ImmTransitionState 클래스입니다.

ImmTransitionInService 클래스입니다.

 

ImmTransitionNoInServiceExternal 클래스입니다.

 

ImmTransitionNoInServiceInteranl 클래스입니다.

 

ImmObject 클래스입니다.

 

마지막으로 시험 코드입니다.

You may also like...