본문 바로가기

프로그래밍 강의 메모/코딩으로 학습하는 GoF의 디자인 패턴_백기선

행동 관련 디자인 패턴 > 상태 패턴(State Pattern)

https://inf.run/6Shr

 

코딩으로 학습하는 GoF의 디자인 패턴 - 인프런 | 강의

디자인 패턴을 알고 있다면 스프링 뿐 아니라 여러 다양한 기술 및 프로그래밍 언어도 보다 쉽게 학습할 수 있습니다. 또한, 보다 유연하고 재사용성이 뛰어난 객체 지향 소프트웨어를 개발할

www.inflearn.com

 

 

상태 패턴

  • 행동 관련 디자인 패턴.
  • 객체 내부 상태 변경에 따라 객체의 행동이 달라지는 패턴.
  • 상태에 특화된 행동들을 분리해 낼 수 있으며, 새로운 행동을 가하더라도 다른 행동에 영향을 주지 않는다.

 

 

 

애플리케이션에서 상태 변경에 따라 어떤 특정한 오브젝트들의 행동이 바뀌는 동작을 스테이트 패턴을 통해 구현할 수 있다.

 

특정한 상태마다 다르게 동작하는 오퍼레이션을 상태 패턴으로 구현하지 않으면 if, else가 잔뜩 들어가게 되고 가독성이 떨어지게 된다.

이럴 때 상태 패턴을 적용하면 좋다.

 

 

 

 

 

 

 

 

상태 패턴의 클래스 다이어그램을 살펴보면,

State는 Context가 변경될 수 있는 여러 상태들에 대한 공통된 인터페이스들을 만들어 놓은 것이다.

Context에는 고유의 정보와 상태 변경을 위한 메서드을 담고있는 클래스이다.

 

Context 클래스가 어떤 행동에 따라 달라지는 operation들을 전부 State를 통해 위임한다.

위임을 하면 특정 상태에 따라 달라지는 operation들의 구체적인 로직은 ConcreteState에서 구현할 것이다.

 

 

 

 

 

 

 

 



 

상태 패턴의 장점

1. 상태에 따른 동작을 개별 클래스로 옮겨서 관리할 수 있다.

2. 기존의 특정 상태에 따른 동작을 변경하지 않고 새로운 상태에 다른 동작을 추가할 수 있다.

3. 코드 복잡도를 줄일 수 있다.

 

 

 

 

 

 

https://refactoring.guru/ko/design-patterns/state

 

State

Use the State pattern when you have an object that behaves differently depending on its current state, the number of states is enormous, and the state-specific code changes frequently. The pattern suggests that you extract all state-specific code into a se

refactoring.guru

 

 

 

 

상태 패턴과 전략 패턴 차이점

https://stackoverflow.com/a/16058371

 

What is the difference between Strategy design pattern and State design pattern?

What are the differences between the Strategy design pattern and the State design pattern? I was going through quite a few articles on the web but could not make out the difference clearly. Can so...

stackoverflow.com

 

 

There can be a major difference, however, if ConcreteStates decide themselves the state transitions (see the "might determine" associations in the diagram above).



차이점은 다음과 같다.

State는, State에 따른 로직의 끝에, setState(new State())를 호출함으로써 

State를 스스로 변환할 수 있는데 반해,

 

Strategy의 경우 외부에서 데이터의 입력이 필요하다.



따라서 다음과 같이 정리할 수 있다.

 

Strategy Pattern : 행동(알고리즘)을 소유한 객체를 실행 시에 선택할 수 있게 하여 상황에 맞는 행동을 하게 하는데 유용

 -> 다양한 알고리즘이 짜증나는 경우 고려

 

State Pattern : 다양한 상태변화(전이)가 아주 복잡한 로직을 제어하는 데 유용

 -> if, else 문에 의한 분기점이 많아 복잡한 경우 고려