자바 디자인 모드 를 괴 롭 히 는 상태 모드

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

  • 상태 모드 와 정책 모드 의 대비
    지금 우 리 는 상태 모델 과 전략 모델 의 구조 가 비슷 하 다 는 것 을 알 지만 그들의 의 도 는 다르다.그들의 주요 차이 점 을 다시 한 번 살 펴 보 자.
  • 정책 모드 는 클 라 이언 트 가 실행 할 때 교환 가능 한 행동 을 사용 할 수 있 도록 관련 알고리즘 을 패키지 합 니 다.상태 모드 는 서로 다른 상태 에서 서로 다른 행동 을 보 여 주 는 데 도움 을 줍 니 다.
  • 상태 모드 는 대상 의 상 태 를 봉 인 했 고 전략 모드 는 알고리즘 이나 전략 을 봉 인 했 습 니 다.상 태 는 대상 과 밀접 한 관 계 를 가지 기 때문에 중용 할 수 없다.그리고 Context 에서 전략 이나 알고리즘 을 분리 하면 다시 사용 할 수 있 습 니 다.
  • 상태 모드 에서 모든 상 태 는 Context 의 인용 을 통 해 상태 이전 을 실현 한다.그러나 모든 정책 은 Context 의 인용 을 가지 고 있 지 않 고 Context 에서 만 사 용 됩 니 다.
  • 정책 은 Collections. sort () 와 같은 매개 변수 로 사용 하 는 대상 에 게 전달 할 수 있 습 니 다. 매개 변 수 는 Comparator 정책 을 포함 합 니 다.다른 한편, 상 태 는 Context 대상 자체 의 일부분 으로 시간 이 지 날수 록 Context 대상 은 한 상태 에서 다른 상태 로 이전 된다.
  • 이들 은 모두 OCP 원칙 에 부합 되 고 전략 모델 도 SRP 원칙 (단일 직책 원칙) 에 부합 되 지만 모든 전략 은 자신의 알고리즘 을 밀봉 하고 다른 전략 에 의존 하지 않 기 때문이다.하나의 전략의 변 화 는 결코 다른 전략의 변 화 를 야기 하지 않 을 것 이다.
  • 또 다른 이론 적 차이: 전략 모델 은 대상 이 '어떻게 하 는 지' 의 부분 을 정의 했다.예 를 들 어 정렬 대상 이 데 이 터 를 어떻게 정렬 하 는 지 등 이다.상태 모드 는 대상 이 '무엇 입 니까' 와 '언제 합 니까' 의 부분 을 정의 합 니 다.예 를 들 어 대상 이 어떤 상태 에 있 고 언제 특정한 상태 에 있 습 니까?
  • 상태 모드 에서 상태 이동 의 순 서 를 잘 정의 했다.정책 모드 는 필요 하지 않 습 니 다. Client 는 모든 정책 을 자 유 롭 게 선택 할 수 있 습 니 다.
  • 흔히 볼 수 있 는 전략 모델 의 예 는 패 키 징 알고리즘 이다. 예 를 들 어 정렬 알고리즘, 암호 화 알고리즘 또는 압축 알고리즘 이다.코드 가 서로 다른 유형의 알고리즘 을 사용 해 야 하 는 것 을 보 았 다 면 전략 모드 를 사용 하 는 것 을 고려 하 세 요.상태 모드 를 언제 사용 하 는 지 식별 하 는 것 은 간단 하 다. 상태 와 상태 이동 을 관리 해 야 하지만 대량의 조건 문 구 를 사용 하고 싶 지 않다 면 그것 이다.
  • 마지막 으로 가장 중요 한 차이 점 은 전략의 변 화 는 Client 에 의 해 이 루어 진 다 는 것 이다.상태의 변 화 는 Context 나 상태 자신 에 의 해 이 루어 진다.

  • 프로젝트 인 스 턴 스
    내 원본 주소 로 건 너 뛰 기
    simple 1 가방 에 서 는 주로 선풍기 의 스위치 상 태 를 전환 합 니 다. 사실 우 리 는 상 태 를 상태 류 에 두 고 고정된 논리 에 따라 전환 합 니 다. 그러나 이런 모델 은 개폐 원칙 에 부합 되 지 않 습 니 다. 왜 냐 면 우리 가 새로 추가, 수정 또는 삭제 상태 가 발생 하면 상태 류 의 상태 전환 을 수정 해 야 하기 때 문 입 니 다.
    public class Application {
    
        public static void main(String[] args) {
            Context context = new Context(new CloseLevelState());
            context.right();
            context.right();
            context.right();
            context.left();
            context.right();
            context.right();
        }
    }

    추상 상태
    public interface LevelState {
    
        /**
         *   
         *
         * @param context
         */
        void left(Context context);
    
        /**
         *   
         *
         * @param context
         */
        void right(Context context);
    
        /**
         *     
         * @return
         */
        String info();
    }

    구체 적 인 위치 상 태 는 나 는 단지 두 개 만 열 거 했 을 뿐, 다른 것 은 유사 하 다.
    @Slf4j
    public class OneLevelState implements LevelState {
    
        @Override
        public void left(Context context) {
            LevelState levelState = new CloseLevelState();
            context.setLevelState(levelState);
            log.info("     {}", levelState.info());
        }
    
        @Override
        public void right(Context context) {
            LevelState levelState = new TwoLevelState();
            context.setLevelState(levelState);
            log.info("     {}", levelState.info());
        }
    
        @Override
        public String info() {
            return "1 ";
        }
    }
    @Slf4j
    public class CloseLevelState implements LevelState {
    
        @Override
        public void left(Context context) {
            LevelState levelState = new ForeLevelState();
            context.setLevelState(levelState);
            log.info("     {}", levelState.info());
        }
    
        @Override
        public void right(Context context) {
            LevelState levelState = new OneLevelState();
            context.setLevelState(levelState);
            log.info("     {}", levelState.info());
        }
    
        @Override
        public String info() {
            return "0 ";
        }
    
    }

    진정한 스위치 는 문맥 이다.
    @Data
    @AllArgsConstructor
    public class Context {
    
        private LevelState levelState;
    
        public void left() {
            levelState.left(this);
        }
    
        public void right() {
            levelState.right(this);
        }
    
        public String info() {
            return levelState.info();
        }
    }

    레 퍼 런 스
    자바 에서 상태 모드 와 전략 모드 의 차이
    상태 모드 | 초보 튜 토리 얼
    주목 을 환영 합 니 다.

    좋은 웹페이지 즐겨찾기