하루 하나의 디자인 모델 - 상태 모드

소개: 상태 모드, 상태 대상 모드 (Pattern of Objects for States) 라 고도 부 르 며, 상태 모드 는 대상 의 행위 모드 입 니 다.상태 모델 은 연구 대상 의 행 위 를 서로 다른 상태 대상 에 포장 하고 모든 상태 대상 은 추상 적 인 상태 류 의 하위 클래스 에 속한다.
역할: 상태 모델 의 의 도 는 상태 에 따라 행 위 를 분리 하고 선택 하여 한 대상 이 내부 상태 가 바 뀔 때 그 행위 도 이에 따라 달라 지 는 것 이다.
장면: 일부 생존 게임, 예 를 들 어 는 장면 에서 비 일회 성 상호작용 물품 이 많다. 예 를 들 어 나무, 풀 등 은 정기 적 으로 시들 고 자란 다.나 무 는 성장 - 결과 - 멸망 으로 나 눌 수 있다.
역할 및 역할
한 업무 에서 우 리 는 if - else 등 이 많 을 것 이다.원래 의 논리 가 옳 을 수도 있 지만 우리 가 그 안에 기능 을 추가 하고 논 리 를 수정 하면 매우 번 거 로 울 것 이다.이 럴 때 상태 모드 를 사용 할 수 있 습 니 다.
역할.
역할.
환경 (Context)
상하 문 이 라 고도 하 는데 상태 가 그 현황 을 결정 한다
추상 상태 (상태)
환경 (Context) 대상 의 특정한 상태 에 대응 하 는 인 터 페 이 스 를 정의 합 니 다.
구체 적 인 상태 (ConcreteState)
모든 구체 적 인 상태 류 는 환경 (Context) 의 한 상태 에 대응 하 는 행 위 를 실현 했다.
2. 나무의 일생 을 모방 합 니 다.
환경 역할
(나무) 평생 겪 을 수 있 는 모든 상 태 를 보존 하고 유전 자 는 나무의 생장 과 결과 의 최대 나 이 를 결정 한다.
public class Tree {
    //     State       
    private TreeState state;
    //            
    public Map states = new HashMap();

    public int growSize;    //       
    public int fruitSize;   //       

    public int now = 1; //     

    public Tree() {
        states.put("grow", new GrowState(this));
        states.put("fruit", new FruitState(this));
        states.put("death", new DeathState(this));

        this.state = states.get("grow");


        //         ,              ,    5 ,  2   
        Random random =new Random();
        growSize =random.nextInt(5);
        fruitSize = random.nextInt(2);
    }

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

    public void handle() {
        state.handle();
    }

}

상태.
public interface TreeState {
    public void handle();
}

성장 상태
나무 가 일정 연령 까지 자라 면 결과 상태 로 들어간다.
public class GrowState implements TreeState {

    private Tree tree;

    public GrowState(Tree tree) {
        this.tree = tree;
    }

    @Override
    public void handle() {
        if (tree.now < tree.growSize) {
            System.out.println("    ");
            tree.now++;
        } else {
            tree.setState(tree.states.get("fruit"));
        }
    }

}

결과 상태
결과 나 이 를 넘 으 면, 나 무 는 사망 상태 로 들어간다.
public class FruitState implements TreeState {

    private Tree tree;

    public FruitState(Tree tree) {
        this.tree = tree;
    }

    @Override
    public void handle() {
        if (tree.now < (tree.growSize + tree.fruitSize)) {
            System.out.println("    ");
            tree.now++;
        } else {
            tree.setState(tree.states.get("death"));
        }
    }

}

사망 상태
public class DeathState implements TreeState {
    private Tree tree;

    public DeathState(Tree tree) {
        this.tree = tree;
    }

    @Override
    public void handle() {
        System.out.println("     ");
        tree.setState(tree.states.get("death"));
    }
}

아 날로 그 성장
어떤 나무의 일생
Tree tree = new Tree();
    while (true) {
        tree.handle();
    }

프로 세 스
    
    
    
    
     

단점 - 클래스 와 대상 의 개 수 를 늘 리 고 잘못 사용 하면 논리 적 혼란 을 초래 할 수 있다.상태 모드 는 '개폐 원칙' 에 대한 지원 이 좋 지 않 습 니 다. 새로운 상태 클래스 를 추가 하려 면 상태 전환 을 담당 하 는 소스 코드 를 수정 해 야 합 니 다.
3. 상태 모델 과 전략 모델 의 비교
인터넷 에서 다른 대신 블 로 그 를 공부 할 때 많은 평론 을 보 았 다. 이것 은 상태 모델 이 아니 라 전략 모델 이거 나 전략 모델 이 아니 라 상태 모델 이 므 로 남 의 자 제 를 망치 지 마라.그러나 블 로 거들 은 옳 았 고 거 친 말 을 하 는 사람들 은 오히려 자신 이 무지 했다.상태 모드 는 항상 전략 모드 와 혼동 된다.간단 한 방법 은 환경 캐릭터 가 뚜렷 한 상태 와 상태의 과도 가 있 는 지 를 고찰 하 는 것 이다.
상태 모드:
상태 모델 처리 의 핵심 문 제 는 상태의 이동 이다. 대상 이 많은 상태 가 존재 하 는 상황 에서 각 상태 간 의 이동 과 이동 과정 은 모두 복잡 하기 때문이다.상태 모델 에서 상태 변 화 는 대상 의 내부 조건 에 의 해 결정 되 고 외부 에 서 는 그 인터페이스 에 만 관심 을 가 져 야 하 며 그 상태 대상 의 생 성과 전환 에 관심 을 가 질 필요 가 없다.
정책 모드:
전략 모델 의 장점 은 대상 의 전략 행 위 를 동적 으로 바 꿀 수 있다 는 데 있다.전략 모델 에서 어떤 전략 을 취 할 지 는 외부 조건 에 의 해 결정 된다. 즉, 어떤 전략 을 사용 할 지 는 우리 가 제공 하고 전략의 구체 적 인 실현 유형 은 대응 알고리즘 을 실현 하 는 것 이다.예 를 들 어 하나의 상품 을 우 리 는 가격 인하 와 가격 인상 전략 을 많이 가 질 수 있다. 우 리 는 각종 전략의 규칙 을 정 한 다음 에 상품 을 집행 하 게 하면 된다.
더 많은 모델: 하루 하나의 디자인 모델 - 분류 와 6 대 원칙
더 많은 원본 코드:https://github.com/oDevilo/Java-Base

좋은 웹페이지 즐겨찾기