자바생
Published 2022. 3. 12. 01:51
State Pattern Design Pattern
728x90

State Pattern은 무엇인가요?

  • 상태에 따라 동일한 작업이 다른 방식으로 실행될 때 해당 상태가 작업을 수행하도록 위임하는 디자인 패턴
    • Context, State, Concrete class 개념
      • Context
        • 상호 작용할 클라이언트에 대한 인터페이스를 정의
        • 객체의 현재 상태를 정의하는 데 사용할 수 있는 구체적인 상태 객체에 대한 참조 유지
      • State
        • 각 구체적인 상태가 수행해야 할 작업을 선언하기 위해 인터페이스 정의
      • Concrete
        • State에 정의된 메서드에 대한 구현을 제공
  • 객체의 내부 상태가 변경될 때, 객체가 동작을 변경할 수 있는 패턴
    • 객체가 클래스를 변경하는 것으로 보임
  • 알림 “상태”에 따라 알림을 수행할 때 모바일의 “동작”이 변경된다.
    • 상태가 vibration이면 진동이 울림
    • 상태가 silence면 무음처리됨

State Pattern은 언제 사용하나요?

  • 상태를 기반으로 object의 behavior가 변경되는 경우
    • 상태 종류가 매우 많아 if/else 구문에 의해 코드가 복잡해질 경우 가독성 떨어질 위험
  • state별 코드가 자주 변경되는 경우

State Pattern을 사용함으로써 장단점이 무엇이 있을까요?

장점

  • 상태별 동작을 유지
  • 모든 상태 전환을 명시적으로 만듬
  • behavior가 상태에 따라 런타임에 변경되어 if/else 또는 switch/case 문에 대한 의존성 제거
    • TV 전원을 껐다 켰다할 때 if/else로 구현할 수 있는데 그렇게 안함
  • cohesion(응집성)을 개선한다.
    • 특정 상태별 behavior들은 ConcreteState class에 모여있기 때문이다.

단점

  • 상태 간의 전환을 구현할 때 상태를 하드코딩 하게 함
    • 그러나 필요와 요구 사항에 따라 문제가 되거나 안될 수도 있음
  • state class가 뚜렷하게 분리되어있는 것이 장점이자 단점
    • 즉, 단점은 계층 수가 늘어나기 때문에 복잡해질 수 있음

Strategy Pattern과 State Pattern의 차이는 뭘까요?

  • 구조가 유사하고 OCP 원칙을 기반으로 하지만 intent는 완전히 다름!!!
💡 strategy는 여러 전략이 존재하여 클라이언트가 어떤 전략이 있는지 알고 전략을 바꾸는 것 state는 클라이언트가 어떻게 변경될 지 모르지만 내부에서 상태에 따라 행동을 달리하고 변경시키고 하는 것임
  1. state 패턴은 객체가 상태를 관리하고, 즉, 객체가 행동의 변화를 주도 strategy 패턴은 클라이언트가 behavior를 결정, 클라이언트가 행동의 변화를 주도
  2. strategy 패턴은 client가 context에 다른 전략을 제공함 state 패턴은 Context나 State 각각이 상태를 관리함
  3. state 패턴은 object의 상태를 캡슐화 strategy 패턴은 알고리즘이나 strategy를 캡슐화
  4. state 패턴은 한 상태에서 다른 상태로 전환 strategy 패턴은 strategy를 객체의 매개 변수로 전달할 수 있음
    ex) Collections.sort()에서의 Comparator
  5. state 패턴은 상태 변경이 컨텍스트 또는 상태 개체 자체에 의해 수행됨 strategy 패턴은client에 의해 strategy가 수정됨

REFERENCES

state pattern은 언제 사용할까

difference between strategy pattern and state pattern

728x90

'Design Pattern' 카테고리의 다른 글

Decorator Pattern  (0) 2022.11.06
Template Callback Pattern  (0) 2022.11.01
Singleton Pattern  (0) 2022.03.17
Command Pattern  (0) 2022.03.15
Strategy Pattern  (0) 2022.03.04
profile

자바생

@자바생

틀린 부분이 있다면 댓글 부탁드립니다~😀

검색 태그