아헿헿헿 2022. 6. 1. 19:36

1. 용도

객체의 내부 상태에 따라 스스로 행동을 변경할 수 있게 허가하는 패턴으로 이렇게 하면 객체는 마치 자신의 클래스를 바꾸는 것처럼 보입니다.


2.  활용성

  • 객체의 행동이 상태에 따라 달라질 수 있고, 객체의 상태에 따라서 런타임에 행동이 바뀌어야 하는 경우
  • 어떤 연산에 그 객체의 상태에 따라 달라지는 다중 분기 조건 처리가 너무 많이 들어 있을 때, 객체의 상태를 표현하기 위해 상태를 표현하기 위해 상태 하나 이상의 나열형 상수로 정의해야 합니다.

3. Class Diagram과 구조

[Context] - 사용자가 관심 있는 인터페이스를 정의합니다. 객체의 현재 상태를 정의한 ConcreteState 객체들의 유지 관리를 합니다

[State] - Context의 각 상태별로 필요한 행동을 캡슐화하여 인터페이스로 정의합니다.

[ConcreteState] - 각 서브 클래스들은 Context의 상태에 따라 처리되어야 할 실제 행동을 구현합니다.

 

  • 상태에 따라 다른 요청을 받으면 Context 클래스는 현재의 ConcreteState 객체로 전달합니다. 이 ConcreteState 클래스의 객체는 State 클래스를 상속하는 서브클래스들 중 하나의 인스턴스일 것입니다.
  • Context 클래스는 실제 연산을 처리할 State 개체에 자신을 매개변수로 전달합니다. 이로써 State 객체는 Context 클래스에 정의된 정보에 접근할 수 있게 됩니다.
  • Context 클래스 또는 ConcrteteState 서브 클래스들은 자기 다음의 상태가 무엇이고, 어떤 환경에서 다음 상태로 가는지 결정할 수 있습니다. 즉, 상태는 상태 이전의 규칙이 있으므로, 각각 한 상태에서 다른 상태로 전이하는 규칙을 알아야합니다.

4. 장단점

장점

  • 상태에 따른 행동을 국소화하며, 서로 다른 상태에 대한 행동을 별도의 객체로 관리합니다 - 임의의 한 상태에서 관련된 모든 행동을 하나의 객체로 모을 수 있습니다. 한 상태에 종속적인 코드를 State 클래스의 자식 클래스에서 모두 정의하였기에, 새로운 상태 및 규칙이 생기면 새로운 서브클래스만 정의하면 됩니다.
  • 상태 전이를 명확하게 만듭니다- 어떤 객체가 자신의 현재 상태를 오직 내부 데이터 값으로만 정의하면, 상태 전이는 명확한 표현을 갖지 못합니다. 따라서 각 상태 별로 별도의 객체를 만드는 것이 상태 전이를 명백하게 해주는 결과가 됩니다.
  • 상태 객체는 공유될 수 있습니다 - 상태는 단지 타입으로만 표현되므로, State 객체는 객체 변수 없이 여러 Context 클래스의 객체로도 공유 할 수 있습니다.

5. 구현 방법

  1. 상태 전이 선정 - 어떤 참여자가 상태 전이를 책임질지 명시하지 않기에, 기준을 Context 클래스 안에다가 구현할 수 있습니다.
  2. 상태 객체의 생성과 소멸 - 상태 객체를 필요할 때만 생성하거나 필요하기 전에 미리 만들어 두는 경우 두가지 중 하나를 선택 가능합니다.
  3. 동적 상속을 이용하는 방법 - 특별 요청에 따라 행동을 바꾸려면 런타임에 객체가 클래스를 변경하는 것으로 해결하면 됩니다. 하지만 이것이 불가능한 경우에는, 위임 주체 객체를 런타임에 변경하여 상속 구조를 변경하는 효과를 내도록 합니다.