State Pattern

About State Pattern

Posted by Damin on October 25, 2019

State Pattern

  • 실세계의 많은 시스템 = 다양한 상태 존재

  • 동일한 자극에 대해 상태에 따라 다른 행위

1
2
3
4
5
6
7
친구가 장난칠 때

-> 우울한 상태

-> 행복한 상태

같은 장난 다른 반응

상태 머신 다이어그램

상태 머신 다이어그램 : 상태와 상태 변화를 모델링하는 UML 도구

  • 상태 : 객체가 가질 수 있는 어떤 조건이나 상황

-> 전구 on/off

  • 상태 전이/진입 : 객체의 한 상태에서 다른 상태로의 이동

-> 특정 이벤트 발생한 후 명세된 조건 만족 -> 전이

-> 이벤트[조건] / 액션

-> switch_on[power exists] / turnOn()

그림7-1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
초기 상태 = OFF

OFF 상태에서 스위치를 키면 switch_on 이벤트 발생

-> 만약 power_exists가 만족하면 ON 상태로 진입 -> turnon 액션 실행

-> 만족하지 못하면 OFF 상태에 머무른다

ON 상태에서 동작 버튼 누르면 run 이벤트 발생

-> WORKING 상태로 진입 -> operate 액션 실행!

ON or WORKING 상태에서 스위치를 끄면 switch_off 이벤트 발생

-> OFF 상태로 진입

그림7-2

간략화 한 사진

OFF 상태에서 switch_on 이벤트 발생 -> Active 복합 상태로 진입

-> 묵시적으로 ON 상태로 진입

그림7-3

이에 대한 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class Light{
  private static int ON = 0;
  private static int OFF = 1;
  private int state;
  
  public Light(){
    state = OFF;
  }
  
  public void on_button_pushed(){
    if (state == ON){
      System.out.println("반응 없음");
    }
    
    else{
      System.out.println("Light On!");
      state = ON;
      
    }
  }
   public void off_button_pushed(){
    if (state == OFF){
      System.out.println("반응 없음");
    }
    
    else{
      System.out.println("Light Off!");
      state = OFF;
      
    }
  }
}

만약 여기에 “Sleeping” 모드가 추가 된다면?

ON 에서 Sleeping 모드로 가는 방향이 생기고

Sleep에서 ON 모드로 가는 것도 생긴다.

-> 유지 보수 너무 안좋다!!

-> OCP 원칙 위반!!!!!

-> 변하는 ‘상태’ 를 기준으로

Strategt pattern 과 State pattern 의 차이!

State = State 변화를 State가 가지고 있다.

-> 이벤트만 주어서 State 안에서 변화를 한다.

-> State가 상태를 바꿔줄 수 있다. (setState는 ON, OFF가 사용!)

-> Client는 전혀 사용 x

Strategy = Client에서 set을 이용해 바꿔 주어야 한다.

-> 그 전의 Strategy 에서 Robot은 Client가 사용한다.

둘이 비슷해 보여도 이런 차이점을 가지고 있다.

혼동 말기를!!