행동 패턴 (육) 모드 상태 (주)

동기 부여 (동기 부여)

   소프트웨어 빌드 과정에서 경우 특정 개체의 변경된 상태, 그들의 행동은 또한 문서 등, 다양 읽기 전용, 읽기 쓰기의 지원 행동을하고 국가 지원의 동작이 완전히 다를 수 있습니다.
   어떻게 개체의 행동의 상태에 따라 런타임에 투명하게 객체를 변경하려면? 작업 및 객체의 상태없이 변환 사이의 강한 결합에 도입?

의도 (의도)

   이 때 내부 상태 변화의 동작을 변경할 객체를 할 수 있습니다. 그래야 객체의 동작을 변경 나타납니다. - "디자인 패턴"GoF의

도 구조 (구조)


구성 모드

    알 수있는 바와 같이, 구조도 상태 패턴에서 다음과 같은 역할을 갖는다 :
(1) 환경 (컨텍스트)의 역할 : 또한 인터페이스 컨텍스트라고도가 클라이언트의 정의에 관심이 있으며, 국가 클래스의 특정 인스턴스를 유지한다. 특정 클래스의 예는이 환경에서 객체의 현재 상태의 상태를 설명한다.
    (2), 추상적 인 상태 (주)의 역할 : 패키지 환경 동작에 해당하는 개체의 특정 상태에 대한 인터페이스를 정의.
    (3), 상태 (ConcreteState)의 특정 역할 : 각 구체적인 클래스는 (문맥) 상태가 행동에 대응하는 환경 상태를 구현한다.
모드 구조의 상태가 환경 추상 클래스와 클래스의 국가의 역할을 이해하는 것이 필요 :
     환경 실제로 가끔 클래스 상태 관리자 (주 관리자) 역할을 할 수있는 환경의 상태를 가지고 객체, 환경의 범주에 명시 할 수 있습니다 스위칭 동작.
     이러한 조건이 종종 필요합니다 추상 상태 클래스는 추상 클래스 일 수 있으며, 다른 상태 범주가 될 수있는 인터페이스는 다른 서브 클래스로 인해 환경을 기반으로 국가의 복수의 존재로 부모 클래스, 클래스 생성 상태를 상속뿐만 아니라, 두 가지 조건을 만족입니다 스위칭, 다른 상태에있는 물체의 다른 동작. 따라서, 다른 동작은 상기 오브젝트의 클래스를 변경 나타난다 객체 환경으로 인해 실제로하지만, 내부 상태가 변경 될 때의 동작을 변경할 수 있도록하는 것이, 그 클래스의 특정 상태에 개별 포장 된 오브젝트를 추출 할 수있다 다른 클래스에 스위치는 특정 상태를 구현합니다. 환경 클래스로 인해이 프로그램의 추상적 인 상태에 있으므로, 프로그램 실행 시간 환경 클래스가 내부 상태를 변경할 수 있도록, 특정 상태 범주 환경 클래스에 설정되어있는 객체의 수, 수, 특정 상태 클래스로 설정할 수 있습니다 동작을 변경합니다.

주 패턴 코드 구현

    온라인 과정에서 상품의 구매, 당신은 주문의 상태를 볼 수 있습니다 : 우리의 현실에서 국가 모델은 유사한 예, 있습니다. 이미 배송 상태에서 주문이 순서가 반환 할 수 없습니다 기업의 경우, 순서의 서로 다른 상태, 고객과 같은 다른 작업 요구 사항을 가질 수 있습니다. 스타킹 단계의 순서는, 고객이 교환 또는 반환 할 수 있습니다. 우리의 주문이 발송하고,이 상품을받을 때까지 기다릴 된 경우 물품이 품질 문제가 발생하는 경우, 거부 할 수 있습니다, 또는 거래의 성공적인 완료, 오늘 우리는 국가 패턴을 구현하는 순서를 설명하기 위해 예를 가지고있다. 다음 코드는 다음과 같습니다

공공  정적  무효 메인 (문자열 []에 args) 
{ 
    // 주문 
    주문 주문 = 새 새 , 순서는 () 
    order.Minute는 = 9. , 
    order.Action은 (); 
    // 순서를 취소 할 수 있습니다 
    order.IsCancel =를 true로 , 
    order.Minute은 = 20입니다 ; 
    order.Action (); 
    order.Minute = 33이다 ; 
    order.Action (); 
    order.Minute = 43이다 ; 
    order.Action (); 
} 

// 문자의 종류에 대응하는 환경 콘텍스트 --- 
공개  밀봉  클래스주문 
{ 
    개인 주 현재, 

    공공 주문 () 
    { 
        // 작동 상태에서 주문을 기다리고, 무 동작 상태로 초기화 
        현재 = 새로운 새로운 WaitForAcceptance (); 
        IsCancel는 = false로 ; 
    } 
    개인  분;
     공공  더블 
    { 
        GET { 반환 분;}
         SET {분 = 값;} 
    } 

    공공  BOOL IsCancel { GET , SET을 } 

    개인  BOOL마침,
     공공  BOOL TaskFinished 
    { 
        GET { 반환 완료;}
         SET {마침 = 값;} 
    } 
    공공  무효 setState를 (주 S) 
    { 
        현재 =의 S; 
    } 
    공공  무효 동작을 () 
    { 
        current.Process ( 다음은이를 ); 
    } 
} 

// --- 역할 상태의 유형에 해당하는 추상적 인 상태 
공용  인터페이스 상태 
{ 
    // 프로세스 주문 
    무효 처리 (주문 순서); 
} 

//국가의 특정 역할에 해당 - 통화 보류 
공공  봉인  클래스 주 : WaitForAcceptance 
{ 
    공공  무효 처리 (주문 순서) 
    { 
        System.Console.WriteLine ( " ! 우리가 준비 스타킹, 접수 시작 " )
         IF (order.Minute < 30 && 주문을 .IsCancel가) 
        { 
            System.Console.WriteLine는 ( " 반 시간 내 접수는, 주문을 취소합니다! " ); 
            order.SetState을 ( 새로운 새로운 CancelOrder ()); 
            order.Action (); 
        } 
        order.SetState ( 새로운 새로운 AcceptAndDeliver () ); 
        order.TaskFinished = false로 , 
        order.Action (); 
    } 
} 

// 배달을 받아 --- 특정 국가의 역할에 해당하는 
공공  봉인  클래스 AcceptAndDeliver : 주 
{ 
    공공  무효 처리 (주문 순서) 
    { 
        System.Console.WriteLine ( " 소개 상품 배송 준비하며, 주문을 취소 할 수 없습니다! " );
         IF (order.Minute < 30 && order.IsCancel) 
        { 
            System.Console.WriteLine는 ( " 합격 반 시간 이내에, 당신은 주문을 취소 할 수 있습니다! " ) 
            order.SetState ( 새로운 새CancelOrder은 ());
            order.Action (); 
        } 
         성공 ());경우 (== order.TaskFinished false로 ) 
        { 
            order.SetState ( 새로운 새로운 ConfirmationReceipt ()); 
            order.Action (); 
        } 
    } 
} 

// 영수증을 확인은 --- 특정 국가의 역할에 해당 
공개  봉인 된  클래스 ConfirmationReceipt : 주 
{ 
    공공  무효 처리 (주문 순서) 
    { 
        System.Console.WriteLine ( " 제품의 검사, 문제는 당신이 로그인 할 수 없습니다 수 있습니다! " ); 
        order.SetState ( 새 새
        order.TaskFinished = 거짓 ; 
        order.Action (); 
    } 
} 

// 거래 성공 --- 국가의 특정 역할에 해당하는 
공공  봉인 된  클래스 성공 : 주 
{ 
    공공  무효 처리 (주문 순서) 
    { 
        System.Console.WriteLine ( " 주문 결제 " ); 
        order.TaskFinished = true로 ; 
    } 
} 

// 특정 국가의 역할 ---에 해당하는 주문 취소 
공공  봉인  클래스 CancelOrder을 : 상태 
{ 
    공공  무효 처리 (주문 순서) 
    { 
        System.Console.WriteLine ( " 제품의 검사를, 문제가, 주문을 취소!" ); 
        order.TaskFinished = 진정한 ; 
    } 
}

상태 패턴을 실현하기 위해 포인트 :

    서브 오브젝트의 상태로 특정 동작과 관련된 모든 상태에 대한 상태 모델 경우, 상태 스위칭, 각 오브젝트를 오브젝트 스위칭 상기 특정 동작 상태 전이 사이에서 달성 인터페이스 상태를 유지하지만 디커플링.
    즉, 완전히 변환을 통해 변환 여부를 중 - 다른 개체의 도입은 상태 전이가 명확하게, 또한 변환이 원자이기 때문에, 즉 다른 상태에 일관성이없는 상태 발생하지 않도록 할 수 있습니다.
    국가가 개체의 인스턴스 변수가 아닌 경우, 각 컨텍스트는 객체의 오버 헤드를 절감, 국가 개체를 공유 할 수 있습니다.

이점 상태 패턴

          (1), 변환 규칙 패키지.
          (2) 가능한 상태의 열거, 열거하기 전에 상태에서 종의 상태를 확인해야합니다.
         (3) 클래스에 상태 관련 행동 모두가, 당신은 쉽게 새로운 상태를 추가 할 수 있습니다 만 개체의 동작을 변경할 수있는 객체의 상태를 변경해야합니다.
          (4)보다는 한 거 조건문 블록보다는, 하나의 개체의 상태 천이 논리 상태를 허용한다.
          (5) 상기 환경은 여러 객체함으로써 시스템의 개체 수를 줄일 수있는 상태 객체를 공유 할 수있다.

결손 상태 모드

         (1) 불가피 상태 모델 시스템을 사용하여 클래스 및 객체의 수를 증가시킨다.
         (2) 구조와 상태 모델의 구현은 다소의 구조 및 프로그램 코드를 초래할 것이다 잘못 사용되는 경우, 더 복잡하다.
         (3) 상태 모드 '개폐 원리 "에 대한 지원은 모드의 상태가 새 클래스를 추가, 상태 전환 상태 전환에 대한 책임이있는 사람들의 소스 코드 상태를 수정해야하거나 새로운 상태로 전환 할 수 없습니다 수 있습니다 매우 좋지 않다; 또한 소스 코드를 수정해야 클래스에 해당하는 클래스의 상태의 동작을 수정합니다.

주 패턴은 다음과 같은 경우에 사용할 수 있습니다 :

           (1) 오브젝트의 동작은 상태 (특성)에 따라 변경 될 수있다하는 연관된 상태에 기초하여 동작을 변경한다.
          (2), 코드가 객체의 상태에 대한 조건문의 큰 숫자를 포함,이 조건문의 출현은 쉽게 고객에게 가능 상태, 클래스와 클래스 라이브러리를 추가 및 삭제할 수 없습니다, 가난한 코드의 유지 보수 및 유연성으로 이어질 수 있습니다 커플 링 사이에 향상된. 이러한 조건에서 문은 객체의 행동을 포함,이 조건은 개체의 다양한 상태에 해당

.NET 모델은 상태를 달성하기 위해

     주 패턴은 완전히 새로운 학습 콘텐츠와 미래의 경우, 다음오고, 인터넷의 실현에 연구되지 않았다. 하지만이 패턴 내부 비즈니스 시스템에서 더 사용을 가질 수있다 생각합니다.

추천

출처www.cnblogs.com/springsnow/p/11359260.html