상태 모드 개선

디자인 모드 의 상태 모드
표준적 인 상태 모드 입 니 다. 그 중에서 Context 는 모든 상 태 를 관리 하고 모든 상 태 는 자신의 클래스 이 며 상태의 유전 논 리 는 상태 에서 스스로 실 행 됩 니 다.
그 다음 에 완전한 상태 모델 은 너무 '무 거 운' 것 을 실현 하고 상태 유통 에 대한 묘 사 는 코드 에 있어 서도 한눈 에 알 수 없 기 때문에 저 는 상태 모델 을 간소화 하고 최적화 시 켰 습 니 다. 이 를 '가 벼 운' 것 으로 사용 하기 쉽 고 실현 하기 쉬 우 며 상태 흐름 이 코드 에 있어 서도 한눈 에 알 수 있 습 니 다. 모든 유통 논 리 는 한 화면 에 나타 날 수 있 습 니 다.
먼저 재 최적화 후의 상태 모델 에 대한 개념 을 소개 한다.
  • 상태: 우선 상태
  • Event: 이벤트, 이벤트 의 촉발 로 State 상태 가 바 뀌 었 습 니 다
  • 다음: 실제 경 로 는 한 상태 가 특정한 사건 을 촉발 하면 구체 적 인 다른 상태 로 변 하 는 것 을 묘사 하 는 것 이다
  • Status: 상태 인 스 턴 스, State 는 상태 에 대한 설명 일 뿐, Status 는 상태 에 대한 인 스 턴 스 를 State 의 설명 에 따라 새로운 State
  • 로 변환 할 수 있 습 니 다.
    코드https://github.com/zephyrleaves/easy-state
    우 리 는 예 를 하나 보면 그 가 어떻게 쓰 는 지 알 수 있다.
    우선 이벤트 이 벤트 를 정의 합 니 다.
    public enum OrderEvent implements Event{//     
    DO,
    //   
    DONE;
    @Override public String getName() {
    return name();
    }
    }

    이 벤트 는 실제 적 으로 매 거 진 것 으로 일련의 상태 와 관련 된 사건 을 열거 한 것 을 볼 수 있다.
    그리고 저희 가 상 태 를 정 해 보도 록 하 겠 습 니 다.
    public enum OrderState implements State {@Next(arc = {“DO->END”, “DONE->END”})
    INIT,
    @Next()
    TEST,
    END;
    @Override public int getValue() {
    return ordinal();
    }
    @Override public String getOrginName() {
    return name();
    }
    @Override public OrderState getStateByName(String name) {
    return valueOf(name);
    }
    }

    State 자체 도 매 거 진 것 을 볼 수 있 습 니 다. 다른 것 은 상태 상 @ Next 와 같은 annotation 이 상태 흐름 의 논 리 를 묘사 하 는 것 입 니 다.
    예 를 들 어 INIT 의 @ Next 는 현재 DO 라 는 이벤트 가 발생 하면 현재 상 태 는 END 로 넘 어 가 는 것 임 을 나타 낸다.
    마지막 으로 연 결 된 실행 결 과 를 보 겠 습 니 다.
    public class StatusTest {@org.testng.annotations.BeforeTest
    public void setUp() {
    }
    @Test
    public void testConstuructor() {
    Status status = new Status(OrderState.INIT);    //      INIT
    Assert.assertEquals(OrderState.valueOf(“INIT”), status.getCurrentState());
    }
    @Test
    public void testHappen() {
    Status status = new Status(OrderState.INIT);    //      INIT
    Assert.assertEquals(OrderState.INIT, status.getCurrentState());
    HappenedResult result = status.happen(OrderEvent.DO);      //       DO  
    Assert.assertEquals(result, HappenedResult.SUCCESS);       //    
    Assert.assertTrue(result.isSuccess());
    Assert.assertEquals(status.getCurrentState(), OrderState.END);    //         END
    Assert.assertEquals(status.getPreviousState(), OrderState.INIT);  //      INIT
    HappenedResult result1 = status.happen(null);               //      
    Assert.assertEquals(result1, HappenedResult.NO_EVENT);       //        
    Assert.assertEquals(status.getCurrentState(), OrderState.END);         //      END
    Assert.assertEquals(status.getPreviousState(), OrderState.INIT);       //       INIT
    HappenedResult result2 = status.happen(OrderEvent.DONE);      //       DONE  
    Assert.assertEquals(result2, HappenedResult.NO_NEXT);         //            DONE  
    Assert.assertEquals(status.getCurrentState(), OrderState.END);      //      END
    Assert.assertEquals(status.getPreviousState(), OrderState.INIT);   //       INIT
    Status status1 = new Status(OrderState.TEST); //      TEST
    HappenedResult result3 = status1.happen(OrderEvent.DO);             //       DO  
    Assert.assertEquals(result3, HappenedResult.NO_ARC);                //               
    Assert.assertEquals(status1.getCurrentState(), OrderState.TEST);         //      TEST
    Assert.assertEquals(status1.getPreviousState(), null);              //       
    }
    }

    2012, 타 오 바 오 문 통. 판권 소유.

    좋은 웹페이지 즐겨찾기