행동 형 모드 - 상태 모드

6233 단어 디자인 모드
개술
상태 모드 (State Pattern) 에서 클래스 의 행 위 는 상태 에 따라 달라 집 니 다.이런 유형의 디자인 모델 은 행위 형 모델 에 속한다.상태 모드 에서 저 희 는 다양한 상 태 를 나타 내 는 대상 과 행동 이 상태 대상 에 따라 달라 지 는 context 대상 을 만 듭 니 다.
소개 하 다.
의도
대상 이 내부 상태 가 바 뀌 었 을 때 행동 을 바 꿀 수 있 도록 허용 합 니 다. 대상 이 종 류 를 수정 한 것 처럼 보 입 니 다.
주요 해결
대상 의 행 위 는 상태 (속성) 에 의존 하고 그 상태 에 따라 관련 행 위 를 바 꿀 수 있다.
언제
코드 에는 대상 상태 와 관련 된 조건문 이 대량으로 포함 되 어 있다.
어떻게 해결 합 니까?
각종 구체 적 인 상태 류 를 추상 화하 다.
키 코드
보통 명령 모드 의 인터페이스 에는 방법 이 하나 밖 에 없다.상태 모드 의 인터페이스 에는 하나 이상 의 방법 이 있다.그리고 상태 모드 의 실현 클래스 의 방법 은 일반적으로 값 을 되 돌려 주거 나 실례 변수의 값 을 바꾼다.상태 패턴 은 일반적으로 대상 의 상태 와 관련 이 있다 는 것 이다.클래스 를 실현 하 는 방법 은 서로 다른 기능 을 가지 고 인터페이스 에 덮어 쓰 는 방법 이 있다.상태 모드 는 명령 모드 와 마찬가지 로 if.. else 등 조건 선택 문 구 를 제거 하 는 데 도 사용 할 수 있 습 니 다.
응용 실례
  • 농 구 를 할 때 운동 선 수 는 정상 상태, 비정 상 상태 와 정상 상태
  • 를 가 질 수 있다.
    장점.
  • 전환 규칙 봉인
  • 가능 한 상 태 를 매 거 하기 전에 상태 종 류 를 확인 해 야 합 니 다
  • 특정한 상태 와 관련 된 모든 행 위 를 한 가지 유형 에 넣 고 새로운 상 태 를 편리 하 게 증가 시 킬 수 있 으 며 대상 의 상 태 를 바 꾸 기만 하면 대상 의 행 위 를 바 꿀 수 있다
  • .
  • 상태 전환 논리 와 상태 대상 을 하나 로 합성 하 는 것 을 허용 한다. 특정한 커 다란 조건 문 블록
  • 이 아니다.
  • 여러 환경 대상 이 하나의 상태 대상 을 공유 하도록 하여 시스템 에서 대상 의 개 수 를 줄 일 수 있다
  • 결점.
  • 상태 모드 의 사용 은 반드시 시스템 클래스 와 대상 의 개 수 를 증가 시 킬 것 이다
  • 상태 모델 의 구조 와 실현 이 비교적 복잡 하 다. 만약 에 잘못 사용 하면 프로그램 구조 와 코드 의 혼란 을 초래 할 수 있다
  • 상태 모드 는 '개폐 원칙' 에 대한 지원 이 좋 지 않 습 니 다. 상 태 를 전환 할 수 있 는 상태 모드 에 대해 새로운 상태 클래스 를 추가 하려 면 상태 전환 을 담당 하 는 소스 코드 를 수정 해 야 합 니 다. 그렇지 않 으 면 새로 추 가 된 상태 로 전환 할 수 없습니다. 또한 특정한 상태 클래스 의 줄 을 수정 하려 면 해당 클래스 의 소스 코드
  • 를 수정 해 야 합 니 다.
    필드 사용
  • 행위 가 상태 에 따라 바 뀌 는 장면
  • 조건, 분기 문장의 대체 자
  • 주의 사항
    행위 가 상태 에 제약 을 받 을 때 상태 모드 를 사용 하고 상태 가 5 개 를 넘 지 않 는 다.
    Demo
    State 인 터 페 이 스 를 만 들 고 State 인 터 페 이 스 를 실현 하 는 실체 상태 클래스 를 만 들 것 입 니 다.Context 는 어떤 상 태 를 가 진 클래스 입 니 다.StatePatternDemo, 우리 의 프 리 젠 테 이 션 클래스 는 Context 와 상태 대상 을 사용 하여 Context 가 상태 가 바 뀌 었 을 때의 행동 변 화 를 보 여 줍 니 다.
    인터페이스 만 들 기
  • State.java
  • public interface State {
       public void doAction(Context context);
    }

    인터페이스 구현 실체 클래스 만 들 기
  • 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";
       }
    }

    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;
       }
    }

    상태 State 가 바 뀌 었 을 때의 행동 변 화 를 Context 로 확인 합 니 다.
  • 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());
       }
    }

    출력 검증
    Player is in start state
    Start State
    Player is in stop state
    Stop State

    총결산
    상태 모드 는 각 상태 에 대응 하 는 조작 을 분리 한다. 즉, 서로 다른 상태 에 대해 서로 다른 하위 클래스 에서 구체 적 인 조작 을 실현 하고 서로 다른 상태의 전환 은 하위 클래스 에서 이 루어 진다. 예 를 들 어 위의 demo 는 똑 같이 doAction 이 서로 다른 상태 에 따라 서로 다른 논 리 를 집행 하고 전통 적 인 방법 에 따라 if else 를 사용 하여 판단 해 야 한다.그러나 상태 모드 를 사용 하면 서로 다른 상 태 를 서로 다른 하위 클래스 로 예화 한 다음 에 서로 다른 하위 클래스 (실제 서로 다른 상태) 에서 서로 다른 논 리 를 실현 할 수 있다. 클 라 이언 트 가 사용 할 때 서로 다른 상태의 하위 클래스 만 예화 하면 서로 다른 상태 에서 의 동명 방법 을 호출 할 수 있다.

    좋은 웹페이지 즐겨찾기