상태 모드


상태 패턴에서는 클래스의 동작이 상태에 따라 변경됩니다. 이러한 유형의 디자인 패턴은 행동 패턴입니다.

상태 패턴에서는 다양한 상태를 나타내는 객체와 상태 객체가 변경됨에 따라 동작이 변경되는 컨텍스트 객체를 만듭니다.

Introduction

의도: 내부 상태가 변경되면 객체의 동작을 변경하여 객체가 클래스가 수정된 것처럼 보이도록 허용합니다.

주요 솔루션: 객체의 동작은 상태(속성)에 따라 달라지며, 상태 변경에 따라 관련 동작도 변경될 수 있습니다.

사용 시기: 코드에는 객체의 상태와 관련된 다수의 조건문이 포함되어 있습니다.

해결 방법: 다양한 특정 상태 클래스를 추상화합니다.

키 코드: 일반적으로 명령 모드 인터페이스에는 한 가지 방법만 있습니다. 상태 패턴 인터페이스에는 하나 이상의 메서드가 있습니다. 또한 상태 패턴의 구현 클래스의 메서드는 일반적으로 값을 반환하거나 인스턴스 변수의 값을 변경합니다. 즉, 상태 패턴은 일반적으로 객체의 상태와 관련이 있습니다. 구현 클래스의 메서드에는 인터페이스의 메서드를 재정의하는 다양한 기능이 있습니다. 명령 모드와 마찬가지로 상태 모드도 if...else와 같은 조건 선택 문을 제거하는 데 사용할 수 있습니다.

적용 예: 1. 농구를 할 때 운동선수는 정상, 비정상 및 초정상 상태를 가질 수 있습니다. 2. Zeng Hou Yi의 Chime에서 'bell은 추상적인 인터페이스', 'Zhong A' 등은 구체적인 상태이며, 'Zeng Hou Yi의 Chime'은 특정 환경(Context)입니다.

장점: 1. 변환 규칙을 캡슐화합니다. 2. 가능한 상태를 열거하기 전에 상태 유형을 결정해야 합니다. 3. 특정 상태와 관련된 모든 동작을 클래스에 넣고 새로운 상태를 쉽게 추가하면 객체의 동작을 변경할 수 있습니다. 4. 상태 전환 논리가 거대한 조건문 블록 대신 상태 개체와 통합되도록 허용합니다. 5. 여러 환경 개체가 상태 개체를 공유할 수 있으므로 시스템의 개체 수가 줄어듭니다.

단점: 1. 상태 모드를 사용하면 필연적으로 시스템 클래스와 개체 수가 늘어납니다. 2. 상태 모드의 구조와 구현은 상대적으로 복잡합니다. 부적절하게 사용하면 프로그램 구조와 코드에 혼란이 생길 ​​수 있습니다. 3. 상태 모드는 "열림 및 닫힘 원리"를 잘 지원하지 않습니다. 상태를 전환할 수 있는 상태 모드의 경우 새 상태 클래스를 추가하려면 상태 변환을 담당하는 소스 코드를 수정해야 합니다. 그렇지 않으면 새 상태로 전환할 수 없습니다. 상태 및 수정 특정 상태 클래스의 동작에는 해당 클래스의 소스 코드 수정도 필요합니다.

사용 시나리오: 1. 상태가 변경됨에 따라 동작이 변경되는 시나리오. 2. 조건문과 분기문을 교체합니다.

참고: 동작이 상태에 의해 제한되고 상태가 5개 이하인 경우 상태 패턴을 사용하세요.

Implementation

우리는 State 인터페이스와 State 인터페이스를 구현하는 엔터티 상태 클래스를 생성할 것입니다. Context는 상태가 있는 클래스입니다.

StatePatternDemo, 데모 클래스는 Context 및 상태 개체를 사용하여 상태가 변경될 때 Context의 동작 변경을 보여줍니다.

state_pattern_uml_diagram.jpg

1단계

인터페이스를 만듭니다.

State.java

public interface State {
   public void doAction(Context context);
}

2단계

인터페이스를 구현하는 엔터티 클래스를 만듭니다.

StartState.java

public class StartState implements State {

   public void doAction(Context context) {
      System.out.println("Player is in start state");
      context.setState(this);	
   }

   public String toString(){
      return "Start State";
   }
}

StopState.java

public class StopState implements State {

   public void doAction(Context context) {
      System.out.println("Player is in stop state");
      context.setState(this);	
   }

   public String toString(){
      return "Stop State";
   }
}

3단계

Context 클래스를 만듭니다.

Context.java

public class Context {
   private State state;

   public Context(){
      state = null;
   }

   public void setState(State state){
      this.state = state;		
   }

   public State getState(){
      return state;
   }
}

4단계

Context를 사용하여 State 상태가 변경될 때 동작이 변경되는 것을 확인하세요.

StatePatternDemo.java

public class StatePatternDemo {
   public static void main(String[] args) {
      Context context = new Context();

      StartState startState = new StartState();
      startState.doAction(context);

      System.out.println(context.getState().toString());

      StopState stopState = new StopState();
      stopState.doAction(context);

      System.out.println(context.getState().toString());
   }
}

5단계

출력을 확인합니다.

rreee